2010-03-25 3 views
3

WatirRSpec을 통해 통합 테스트를 수행하려고합니다. 그래서/integration 내에서 테스트 파일을 만들고 테스트 사용자를 추가하여 factory_girl을 통해 테스트 사용자를베이스에 추가합니다.factory_girl 레코드는 어디에 있습니까?

문제는 - 실제로 테스트 사용자와 로그인을 수행 할 수 없습니다. 내가 쓴 시험은 다음과 같습니다 : 나는 테스트를 시작하고 브라우저에서 "성능"을 참조하고 있습니다으로

... 

before(:each) 
    @user = Factory(:user) 
    @browser = FireWatir::Firefox.new 
end 

it "should login" 
    @browser.text_field(:id, "username").set(@user.username) 
    @browser.text_field(:id, "password").set(@user.password) 
    @browser.button(:id, "get_in").click 
end 

... 

, 그것은 항상 Username is not valid 오류를 발생합니다.

저는 조사를 시작했고 작은 트릭을했습니다. 우선, 공장에서 실제로 DB에 사용자를 생성하면 의심이 생기기 시작했습니다. 그래서 공장에 대한 즉각적인 호출 이후에 이 실제로 DB에있는이라는 것을 발견하기 위해 일부 puts User.find 물건 만 넣었습니다. 좋아,하지만 사용자가 아직 로그인 할 수 없었기 때문에 나는 DB에 자신의 눈이 있는지 확인하기로 결정했습니다.

공장 호출 직후에 sleep을 추가했으며 현재 DB에 무엇이 있는지 확인했습니다. 나는 사용자가 실제로 거기에서 놓치고있는 것을보기 위해 깔려졌다! 어째서? 그래도 코드 내에서 사용자를 출력하려고 할 때 실제로 어딘가에서 가져 오는 중입니다. 그래서 런타임에 factory_girl이 만든 레코드는 어디에 있습니까?test 또는 dev DB입니까? 나는 그것을 얻지 않는다.

test 모드에서 내 잡종을 실행하는 경우 10 번 확인했는데 (통합 테스트를 조정하려고 했으므로 문제가되는 것 같습니까?) 내 database.yml이 올바른 연결을 보유하고 있다면 데이터.

여기에 authlogic을 사용하고 있는데, 단서를 줄 수 있다면 (아니요, 여기에 activate_authlogic이 적용되지 않습니다).

+0

사용자가 공장에서 생성하는 소녀가 활성화 되었나요? – shingara

+0

@shingara 내가 Factory를 호출하는 순간, 생성자'User'가 빌드되어 db에 적용됩니다. – gmile

+0

예, 컨트롤러로 연결하는 동안 예를 통해 이메일로 활성화 여부를 확인할 수 있습니다. – shingara

답변

2

어쨌든 솔루션이 이상해졌습니다. 저는 공장을 이전 (: 전체) 블록에 배치하고 필요한 모든 작업을 수행했습니다.

+2

jbpros 답변보기 - 테스트의 트랜잭션과 다른 DB 연결이 서로의 트랜잭션을 조사 할 수 없기 때문입니다.before (: all)는 각 테스트 주위의 트랜잭션 외부에 있습니다. –

4

사양을 실행할 때 RSpec이 아마도 변환을 사용하고 있다는 것을 잊지 마십시오. RSpec은 트랜잭션 내에서 스펙의 실행을 래핑하고 끝에 롤백합니다. 즉, 거래 외부에서 (즉 다른 SQL 연결에서) 레코드를 볼 수 없다는 뜻입니다.

before(:each) 
    @user = Factory(:user) 
    User.find_by_username(@user.username).should_not be_nil 
    @browser = FireWatir::Firefox.new 
end 
+0

감사합니다. 명심하십시오. – gmile

+0

감사합니다. JS 테스트를 받기 위해 2 시간 동안 검색해 주셔서 감사합니다. –

+0

도움이 된 것을 기쁘게 생각합니다 :) – jbpros

-1

공장 소녀 테스트 데이터베이스 임시 DB 항목을 만들 것입니다 :

당신이 사용자 레코드를 확인하려면

실제로 공장 소녀에 의해 만들어진, 당신은 뭔가를 할 수 있습니다. 테스트 데이터베이스는 각 테스트 후에 지워집니다.