2014-11-29 20 views
5

Sono nuovo alla programmazione e ho imparato Ruby on Rails per circa 11 settimane.Factory factory di Factory Girl Devise non è valida - non supera il test RSpec

Quando si cerca di testare la mia fabbrica di utente per la convalida, ottengo

1) User has a valid factory 
    Failure/Error: expect(@user.valid?).to eq(true) 

     expected: true 
      got: false 

     (compared using ==) 

sto usando Devise per il mio modello di utente, e factorygirl per le mie fabbriche.

Qui è la mia fabbrica di utente:

FactoryGirl.define do 
    factory :user do 
    name "John Fahey" 
    sequence(:email, 100) { |n| "person#{n}@example.com" } 
    password "password" 
    password_confirmation "password" 
    confirmed_at Time.now 
    end 
end 

... e qui è la mia spec

require 'rails_helper' 

    describe User do 
    before do 
     @user = build(:user) 
    end 

    it "has a valid factory" do 
    expect(@user.valid?).to eq(true) 
    end 
end 

Ho lavorato su come ottenere questo spec passare per un po 'di tempo. Per un po 'ho ricevuto l'errore "e-mail già presa" e l'ho superato. Ho persino avuto la spec per passare una volta, ma stavo usando la sintassi "dovrebbe essere" ora deprecata. Quando vado alla sintassi corretta ": expect" ottengo questo errore. Qualcuno ha un'idea di cosa sto facendo male qui?

Ecco il mio modello

class User < ActiveRecord::Base 

    #== schema information. 
    # create_table "users", force: true do |t| 
    # t.string "name" 
    # t.string "email",     default: "", null: false 
    # t.string "encrypted_password",  default: "", null: false 
    # t.string "reset_password_token" 
    # t.datetime "reset_password_sent_at" 
    # t.datetime "remember_created_at" 
    # t.integer "sign_in_count",   default: 0, null: false 
    # t.datetime "current_sign_in_at" 
    # t.datetime "last_sign_in_at" 
    # t.string "current_sign_in_ip" 
    # t.string "last_sign_in_ip" 
    # t.string "confirmation_token" 
    # t.datetime "confirmed_at" 
    # t.datetime "confirmation_sent_at" 
    # t.string "unconfirmed_email" 
    # t.datetime "created_at" 
    # t.datetime "updated_at" 
    # end 

    # add_index "users", ["email"], name: "index_users_on_email", unique: true 
    # add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 


    has_one :list 
    has_many :items, through: :list 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :confirmable 
end 

qui è quello che vedo quando creo un'istanza utente nella console rotaie e banco di prova per gli errori:

2.0.0-p576 :004 > @user = User.create 
    (0.2ms) begin transaction 
    (0.2ms) rollback transaction 
=> #<User id: nil, name: nil, email: "", encrypted_password: "", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_coun 
t: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, confirmation_token: nil, confirmed_at: nil, confirmation_sen 
t_at: nil, unconfirmed_email: nil, created_at: nil, updated_at: nil> 
2.0.0-p576 :005 > @user.save 
    (1.0ms) begin transaction 
    (0.1ms) rollback transaction 
=> false 
2.0.0-p576 :006 > puts(@user.errors) 
#<ActiveModel::Errors:0xa7cff88> 
=> nil 
2.0.0-p576 :007 > 

quando stampo i messaggi di errore, ho get

2.0.0-p576 :007 > puts(@user.errors.messages) 
{:email=>["can't be blank"], :password=>["can't be blank"]} 
=> nil 

ecco qualcosa di interessante. Per sicurezza, ho fatto un rake db: migrate, e un rake db: test: preparare. Il test è passato. Poi ho fatto di nuovo il test esatto, e non è riuscito.

[email protected]:~/code/blocitoff$ rake db:migrate 
[email protected]:~/code/blocitoff$ rake db:migrate 
[email protected]:~/code/blocitoff$ rake db:test:prepare 
[email protected]:~/code/blocitoff$ rspec spec/models/user_spec.rb 
#<ActiveModel::Errors:0xbdf0740> 
. 

Finished in 0.1764 seconds (files took 8.96 seconds to load) 
1 example, 0 failures 
[email protected]:~/code/blocitoff$ rspec spec/models/user_spec.rb 
#<ActiveModel::Errors:0xa97066c> 
F 

Failures: 

    1) User has a valid factory 
    Failure/Error: expect(@user.valid?).to eq(true) 

     expected: true 
      got: false 

     (compared using ==) 
+0

per favore pubblicare 'app/models/user.rb' con convalide. –

+0

Senza vedere il tuo modello è difficile dirlo. Esegui il debug del motivo per cui si lamenta in "ha uno stabilimento valido", ad es. con: '@ user.errors' prima dell'asserzione. – blelump

+0

Ok, ho aggiornato la mia domanda per includere il mio modello e le informazioni sullo schema. – EricLowber

risposta

2

l'attributo email deve essere univoco e non sei pulizia del database tra i test, in modo che stai ricevendo in caso di errore sulla seconda e successive esecuzioni del test. Vedere https://relishapp.com/rspec/rspec-rails/docs/transactions per informazioni sull'utilizzo delle transazioni in RSpec.

+0

Beh, il problema era che avevo un database più pulito. Tuttavia, ho avuto una cattiva sintassi nel mio file di pulizia del database. non ha capitalizzato DatabaseCleaner. Invece, ha databaseCleaner. – EricLowber

+0

Sono curioso: hai generato un errore visibile con il riferimento 'databaseCleaner'? –

+0

No. Mi stavo solo preparando per dire che avevo già un pulitore di database. Poi ho controllato il file per assicurarmi che fosse tutto in ordine - e ho scoperto che non lo era. A proposito, per il tuo aiuto su questo, comunque. – EricLowber

1

Solo per impacchettare ciò che Peter ha detto, sono riuscito a risolvere il problema aggiungendo questa impostazione al mio spec_helper.rb.

RSpec.configure do |config| 
    config.use_transactional_fixtures = true 
end 
Problemi correlati