2011-02-09 92 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.last'替換所有'@ user'引用會導致測試按預期執行。 – Andrew

+0

@Andrew檢查數據庫的工作,但它不是集成測試。更好的方法是,例如如'當我更改我的個人資料' - '訪問個人資料頁' - '然後我應該在「名字」內看到「約翰」。事實上,有一大堆預定義的Web步驟帶有這樣的斷言,所以這可能是開箱即用的。免責聲明:當然,一切都取決於你想要測試什麼。 –

+0

感謝您的建議,藝術。我明白了,但作爲我的集成測試的一部分,我試圖測試向用戶顯示的內容以及幾個不是的東西。這個測試的目的是確保提交表單實際上改變了數據庫,並確定了API調用等(我有一些AND子句,因爲它們與測試不起作用無關)。這個人的個人資料頁面上顯示的內容是一個規範,至少就像我設置的那樣。 – Andrew