2012-01-19 19 views
1

私はキュウリのシナリオに加えて、いくつかの要求仕様を書くことに決めました。しかし、私の最初の例で失敗しました:Rails要求仕様がput要求を出していない

だから私goalsControllerこのputメソッドです:

def achieve 
     @goal.update_attribute(:achieved, true) 
     redirect_to :back 
    end 

が、これは一例です:

# -*- coding: utf-8 -*- 
require 'spec_helper' 

describe "Achievements" do 
    before(:all) do 
    @bob = Factory(:user, :email => "[email protected]", :password => "qweqwe", :password_confirmation => "qweqwe", :money => 500) 
    @achieve = Factory(:goal, :user => @bob, :title => "Notebook", :price => 100, :achieved => false) 
    login_user('[email protected]', 'qweqwe') 
    end 
    it 'can not be achieved twice' do 
     visit dashboard_path 
     put achieve_user_goal_path(@bob, @achieve) #Passes it well 
     @achieve.reload #same with or without this line 
     @achieve.achieved.should equal true #Fails 
    end 
end 

だから、後に置く要求は、フィールドがtrueになる '達成' 。私のアプリやキュウリのステップでは完璧に動作しますが、このrspecの例では動作しません。 rspecのように 'put'の行を無視するだけです。

答えて

0

これがどのように正しく動作するかを理解すると、RSpecはRailsのTest :: Unitヘルパーを使用します。もしあなたが記述しているものからコントローラ名を読み込むなら、文字列だけでなく、describe AchievementsControllerが必要です。ページを訪問してputを送信しない場合は、コントローラーについて説明してputを送信してください。

つまり、capybara統合テストヘルパーを使用している場合、putgetのような単体テストヘルパーはおそらく、ブラウザドライバのコンテキスト外で実行されるため、おそらくあなたが望むことをしません。必要なリンクまたはボタンをクリックするように、またはユーザーが実行する操作を実行するように、Capybaraに指示する必要があります。

+0

ユーザーがこのputを再度要求しようとすると、すべて正常に動作することをテストします。たとえば、2つの同じページを開いて、両方のページで「達成」をクリックしようとするとします。 –

+0

私はあなたの質問からそれを得ていませんでした。私が知る限り競争条件をテストすることはあまり簡単ではありませんが、同時に実行する要求がない場合は、パスを見つけてボタンを2回クリックしてください。 – d11wtq

+0

このパスの次の訪問時には、目標が達成されているので、このボタンはありません。しかし、以前のユーザーが別のページを開いた場合、このボタンが表示され、ユーザーはもう一度そのページをクリックできます。私のコードはすでにこの動作に安全です(#achieveアクションからすべてのコードを挿入したわけではありません)。要求仕様でテストしたいだけです。 –

関連する問題