2016-09-03 5 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 

오류를 실패하는 테스트를하고 난 그것을 해결하는 방법을 확실입니다. user_factory.rb 여기

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

end 

됩니다 :

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

내가 여기

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입니다 : 여기

는 secret_spec.rb의 테스트입니다 임의의 전자 메일 주소를 생성하고 사용자 팩토리가 전자 메일을 사용하는 유일한 곳이므로 전자 메일을받는 방법은 혼란 스럽습니다. 이미 찍은 메일.

도움 주셔서 감사합니다.

+0

게시 한 것으로 분명하지 않음. 디버깅이 필요합니다. 테스트 데이터베이스를 다시 빌드하고 차이가 있는지 확인하십시오. 문제를 일으키는 최소 비밀/사용자 수를 찾습니다. 불만을 제기하는 이메일과 데이터베이스에있는 이메일을 인쇄하는 사용자에게 수동 검증을 추가하십시오. –

답변

3

번만 임의의 이메일을 생성하는 중입니다.입니다. 당신은 다음과 같이 블록 내부 Faker::Internet.safe_email 코드, 를 실행해야합니다

당신이 공장을 정의함에 따라
FactoryGirl.define do 
    factory :user, aliases: [:author] do 
    email { Faker::Internet.safe_email } 
    end 
end 

, Faker::Internet.safe_email 만 사용자의 공장 정의 단계에서 실행됩니다. 블록을 전달하면 proc이 문자열 대신 저장됩니다. Faker::Internet.safe_email을 포함하는이 proc는 매번 새로운 가짜 이메일을 제공하는 create_list(:secret, 5)을 실행할 때마다 실행됩니다.

대체 방법은 sequence 방법을 사용하는 것입니다.