2010-04-23 3 views
25

FactoryGirl/shoulda을 사용하여 세션을 시뮬레이션하려고합니다 (조명기와 함께 작동했지만 공장 사용에 문제가 있습니다). 나는 공장 (사용자 로그인과 이메일 모두가 unique 검증) 다음과 같은 한 :공장 소녀가 언제 db로 개체를 만드나요?

Factory.define :user do |u| 
u.login 'quentin' 
u.email '[email protected]' 
end 

Factory.define :session_user, :class => Session do |ses| 
ses.association :user, :factory => :user 
ses.session_id 'session_user' 
end 

을 여기에 테스트

class MessagesControllerTest < ActionController::TestCase 

context "normal user" do 
    setup do 
    @request.session[:user_id]=Factory(:user).id 
    @request.session[:session_id]=Factory(:session_user).session_id 
    end 

    should "be able to access new message creation" do 
    get :new 
    assert_response :success 
    end 
end 
end 

입니다하지만 난 rake test:functionals를 실행할 때,이 시험 결과를 얻을

1) Error: 
    test: normal user should be able to access new message creation. (MessagesControllerTest): 
    ActiveRecord::RecordInvalid: Validation failed: Account name already exists!, Email already exists! 

이는 테스트 설정에서 참조 할 때 레코드가 이미 db에 있음을 의미합니다. 여기서 이해할 수없는 것이 있습니까? FactoryGirl은 시작할 때 모든 공장을 db로 생성합니까?

레일 2.3.5/했어야/FactoryGirl

답변

36

Factory(:user)Factory.create(:user) 그래서 당신의 설정 내에서 두 개의 객체를 생성하고 데이터베이스에 저장에 대한 바로 가기입니다.

Factory.build(:user)user 레코드를 DB에 저장하지 않고 작성합니다.

편집은 session_user 공장 내에서

당신은 사용자를 생성 한 다음 테스트 설정 내의 다른를 만들 수 있습니다. session_user 공장에 협회가 있으므로 FactoryGirl은 새로운 user 레코드를 생성합니다.

다음과 같이 당신은 session_user 객체에서 user 인스턴스를 얻을 수 있습니다 : -

context "normal user" do 
    setup do 
    session = Factory(:session_user) 
    @request.session[:session_id] = session.session_id 
    @request.session[:user_id] = session.user_id 
    end 

또는 다음과 같이 고유 한 이름과 이메일 주소를 확인하기 위해 user 공장에 몇 가지 세부 사항을 추가 할 수 있습니다 : -

Factory.define :user do |u| 
u.sequence(:login) {|n| "quentin#{n}" } 
u.sequence(:email) {|n| "quentin#{n}@example.com"} 
end 
+1

하지만 내 코드에는 하나의 팩토리 (: 사용자) 언급이 있습니다. 왜 두 번 실행됩니까? (두 번째는 Factory (: session_user), Session 인스턴스 임) –

+0

죄송합니다. 질문을 읽어야합니다 –