2011-07-05 10 views
2

Rails 3アプリでCapybara 1.0テストを実行して、確認リンクをクリックしたときに実際に確認されたかどうかをテストします。Rails 3/Capybaraがモデル属性を保存していません

これは実際に手動でテストするときに実際に機能します。さらに、あなたが見ることができるように、これをデバッグするための確認メソッドに入れたputs @ user.confirmed行があり、テストを実行すると実際に真を出力します。ただし、テスト自体は失敗します。

コントローラーメソッドを実行した後、私のユーザーモデルで確認済みの属性がテストによって記憶されていないようです。

私には何が欠けていますか?事前にありがとうございます。

テスト:

it "should allow a user to be confirmed after clicking confirmation link" do 
    fill_in('user_email', :with => '[email protected]') 
    click_button('Submit') 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_false 
    visit confirm_path(@user.confirmation_code) 
    @user.confirmed.should be_true 
end 

コントローラ方法:

def confirm 
    @confirmation_code = params[:confirmation_code] 
    @user = User.find_by_confirmation_code(@confirmation_code) 
    @website = @user.website 
    @user.confirm 
    if @user.referrer_id 
     User.find(@user.referrer_id).increment_signups 
    end 
    flash[:success] = "Thanks for signing up!" 
    flash[:user_show] = @user.id 
      puts @user.confirmed 
    redirect_to "http://" + @website.domain_name 
end 

Userモデル方法:

def confirm 
    self.confirmed = true 
    self.save 
end 

答えて

4

それはあなたがconfirm_pathを訪問した後、ユーザーオブジェクトをリロードする必要があるだろうということですか?試してみてください:

it "should allow a user to be confirmed after clicking confirmation link" do 
    fill_in('user_email', :with => '[email protected]') 
    click_button('Submit') 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_false 
    visit confirm_path(@user.confirmation_code) 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_true 
end 

また、@user.reloadを使用することもできます。

あなたのテストで参照されるユーザーオブジェクトは、アプリケーションによって操作されているオブジェクトのコピーにすぎないので、自動的にリフレッシュされることはありません。更新された値を取得するには、データベースから再度フェッチする必要があります。

+0

はい!今すぐテストが動作します。迅速かつ正確な対応に感謝します! – Rebitzele

関連する問題