私はキュウリのシナリオに加えて、いくつかの要求仕様を書くことに決めました。しかし、私の最初の例で失敗しました: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'の行を無視するだけです。
ユーザーがこのputを再度要求しようとすると、すべて正常に動作することをテストします。たとえば、2つの同じページを開いて、両方のページで「達成」をクリックしようとするとします。 –
私はあなたの質問からそれを得ていませんでした。私が知る限り競争条件をテストすることはあまり簡単ではありませんが、同時に実行する要求がない場合は、パスを見つけてボタンを2回クリックしてください。 – d11wtq
このパスの次の訪問時には、目標が達成されているので、このボタンはありません。しかし、以前のユーザーが別のページを開いた場合、このボタンが表示され、ユーザーはもう一度そのページをクリックできます。私のコードはすでにこの動作に安全です(#achieveアクションからすべてのコードを挿入したわけではありません)。要求仕様でテストしたいだけです。 –