2011-02-09 15 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」が表示されるはずです。実際には、このようなアサーションを持つ事前定義されたWebステップがたくさんあるので、これは箱の中でうまくいくかもしれません。免責条項:もちろん、すべては正確に何をテストしたいかによって異なります。 –

+0

チップのおかげで、アート。私はそれを知っているが、私の統合テストの一環として、私はユーザに表示されるものだけでなく、いくつかのものをテストしようとしている。このテストの目的は、フォームを提出すると実際にデータベースが変更され、特定のAPI呼び出しなどが行われたことを確認することです(テストが機能しなかった理由とは関係がないため、中止したいくつかのAND節があります)。人のプロフィールページに表示される内容は、少なくとも私が設定したとおり、仕様です。 – Andrew

関連する問題