2016-09-03 2 views
3

私が原因RspecとFactoryGirlを使用してリストを作成しようとすると、検証に失敗しますか?

Secret#last_five returns the last 5 secrets when last_five is called 
Failure/Error: let!(:secrets){create_list(:secret, 5)} 

ActiveRecord::RecordInvalid: 
    Validation failed: Email has already been taken 

エラーに失敗しているテストを持っていると私はそれを修正するかどうかはわからないと思います。ここで

はsecret_spec.rbでのテストである:ここで

describe Secret do 
    describe "#last_five" do 
    let!(:secrets){create_list(:secret, 5)} 
    it "returns the last 5 secrets when last_five is called" do 
     expect(Secret.last_five.count).to eq(5) 
    end 
    end 
end 

はsecret_factory.rbです:ここでは

FactoryGirl.define do 
    factory :secret do 
    title "Title" 
    body "this is the body" 
    author 
    end 

end 

はuser_factory.rbです:

FactoryGirl.define do 
    factory :user, aliases: [:author] do 
    name "Foobar" 
    email Faker::Internet.safe_email 
    password "password" 
    password_confirmation "password" 
    end 
end 

私はランダムな電子メールアドレスを生成し、ユーザファクトリは私がEメールを使用している唯一の場所なので、どのようにEを取得しているのか混乱しています既に取られたメール。

ありがとうございました。

+0

投稿した内容からはっきりとわかりません。デバッグが必要です。テストデータベースを再構築して、違いがあるかどうかを確認します。問題を引き起こす秘密/ユーザーの最小数を探します。ユーザーに不具合のある電子メールとデータベース内の電子メールを印刷する手動検証を追加します。 –

答えて

3

問題は、ランダムなメールをで1回だけに生成していることです。

FactoryGirl.define do 
    factory :user, aliases: [:author] do 
    email { Faker::Internet.safe_email } 
    end 
end 

あなたは工場出荷時に定義されてきたように、Faker::Internet.safe_emailだけで、ユーザーの工場の定義フェーズで実行されます。 あなたはこのように、ブロック内部Faker::Internet.safe_emailコードを実行する必要があります。ブロックを渡すと、文字列の代わりにprocが格納されます。 Faker::Internet.safe_emailを含むこのprocは、毎回create_list(:secret, 5)を実行するたびに実行され、毎回新しい偽の電子メールが表示されます。

代わりに、sequenceメソッドを使用することもできます。

関連する問題