2011-02-09 2 views
0

저는 오이를 처음 접했고이 통합 테스트가 실패한 이유를 완전히 놓쳤습니다.오이 + Webrat가 양식을 제출하지 않습니까?

Scenario: User changes profile 

    Given I have an account 
    When I change my profile 
    Then my profile should be saved 

Scenario: User changes login 

    Given I have an account 
    When I change my login information 
    Then my account should be changed 

그리고이 단계의 정의 : 나는 다음과 같은 시나리오가

Given /^I have an account$/ do 
    @user = Factory.create(:user) 
    visit login_path 
    fill_in "Email", :with => @user.email 
    fill_in "Password", :with => 'secret' 
    click_button "Sign in" 
end 

When /^I change my profile$/ do 
    visit edit_user_profile_path(@user) 
    fill_in "First name", :with => "John" 
    fill_in "Last name", :with => "Doe" 
    click_button "Update Profile" 
end 

Then /^my profile should be saved$/ do 
    @user.profile.first_name.should == "John" 
    @user.profile.last_name.should == "Doe" 
end 

When /^I change my login information$/ do 
    visit edit_user_path(@user) 
    fill_in "Email", :with => "[email protected]" 
    click_button "Update Login Information" 
end 

Then /^my account should be changed$/ do 
    @user.email.should == "[email protected]" 
end 

을 그리고 나는이 메시지와 함께 두 시나리오 모두에서 "다음"조건 실패 :

# Scenario 1 
expected: "John" 
got: "Test1" (using ==) (RSpec::Expectations::ExpectationNotMetError) 

# Scenario 1 
expected: "[email protected]" 
got: "[email protected]" (using ==) (RSpec::Expectations::ExpectationNotMetError) 

그래서,에 두 경우 모두 사용자 로그인 또는 프로파일을 업데이트하기 위해 양식을 제출 한 후에 공장 정보가 여전히 존재합니다. 그러나 실제 브라우저에서 테스트하면 완벽하게 작동합니다. 그래서, 왜이 시험은 실패합니까?

도움 주셔서 감사합니다.

+0

@user를 사용하는 대신 로그인 한 현재 사용자를 얻는 기능이 있습니까? –

+0

current_user 메서드가 있지만 테스트에서 액세스 할 수 있습니까? 양식을 업데이트하거나 결과를 확인하기 위해 @user 대신에 사용 하시겠습니까? 어쨌든 나는 그것이 어떻게 중요 할지를 보지 못한다. 폼은 분명히 정확한 사용자를 잡아 내고 있고 페이지는 webrat에서 올바르게 로딩되고있다. (내가 무엇을 채우거나 클릭하는지에 대한 에러를 발생시키지 않기 때문에) 컨트롤러는 현재 사용자가 편집 중이 아닌 한 허용하지 않습니다. – Andrew

답변

1

@user 귀하의 오이 코드 블록 안에 사는 변수입니다. 그것은 변경되지 않습니다. 테스트에서 변경 될 내용은 데이터베이스 레코드입니다. 실제로 변경되었는지 확인하려면 사용자 이름이 표시된 일부 페이지를 방문해야합니다.
(실제 시험과 동일)

+0

좋아,이 방법으로 작동하는 이유는 이해가되지 않지만 올바른지 확인할 수 있습니다. 다음 독자를 위해 설명을 추가하려면 시나리오의 각 단계에서 레코드를 다시 찾아야합니다. '@ user' 인스턴스 변수는 단계적으로 단계를 거치지 만 데이터베이스의 데이터는 최신 상태로 유지되지 않습니다. 모든'@ user' 참조를'User.last'로 바꾸면 테스트가 예상대로 수행됩니다. – Andrew

+0

@Andrew 데이터베이스 검사는 작동하지만 통합 테스트가 아닙니다. 더 나은 접근 방식은 예를 들어 '내 프로필을 변경하면'- '프로필 페이지를 방문하십시오'- '그러면'이름 '에'John '이 표시됩니다. 사실 이러한 어설 션으로 사전 정의 된 웹 단계가 많이 있으므로이 기능이 제대로 작동하지 않을 수 있습니다. 면책 조항 : 물론 모든 것은 정확하게 테스트하기를 원하는지에 달려 있습니다. –

+0

팁 주셔서 감사합니다. 알겠지만 통합 테스트의 일환으로 사용자에게 표시되는 사항은 물론 여러 가지 사항을 테스트하려고합니다. 이 테스트의 목표는 폼을 제출하면 실제로 데이터베이스를 변경하고 특정 API 호출 등을 수행했는지 확인하는 것입니다 (테스트가 작동하지 않는 이유와 관련이 없기 때문에 일부 중단 조항이 있습니다). 테스트 사람의 프로필 페이지에 표시되는 내용은 적어도 설정 한대로 사양입니다. – Andrew