0

プロジェクト、タスク、およびサブタスクにポリモーフィックに属するディスカッションがあります。ユーザーが「ディスカッションを終了する」リンクをクリックすると、ディスカッション モデルのブール属性が false から true に変わります。

私はこれを以下の仕様で TDD しました。ブール値は実際に変更されますが、仕様は失敗し、false が true であると予想されます。

これが以下の仕様です。73 行目で失敗し、false が true であると予想されます。だから私の考えは、仕様を間違って書いたということです。

  5   let!(:user) { FactoryGirl.create(:confirmed_user) }
  6   let!(:project) { FactoryGirl.create(:project) }
  7   let!(:task) { FactoryGirl.create(:task, :project => project) }
  8   let!(:subtask) { FactoryGirl.create(:subtask, :task => task) }
  9   let!(:discussion_for_subtask) { FactoryGirl.create(:discussion,
 10                                                      :user => user,
 11                                                      :discussionable => subtask) }
 15 
 16   before do
 17     sign_in_as!(user)
 18     user.projects << project
 19   end

 68     it 'should be able to finish the discussion if they started it/are admin' do
 69       visit subtask_discussions_path(subtask)
 70       click_link "#{discussion_for_subtask.name}"
 71       current_path.should == subtask_discussion_path(subtask, discussion_for_subtask)
 72       click_link 'Finish discussion'  
 73       discussion_for_subtask.finished.should == true
 74       current_path.should == subtask_discussions_path(subtask)
 75     end

そして、ここに私の工場があります( FactoryGirl を使用):

  1 FactoryGirl.define do      
 16 
 17   # USER                   
 18   factory :user do         
 19 
 20     sequence(:name) do |n|
 21       "Name#{n}"           
 22     end  
 23     sequence(:email) do |n|
 24       "FactoryEmailNumber#{n}@example.com"
 25     end                    
 26     password 'secret'      
 27     password_confirmation 'secret'  
 28 
 29     factory :confirmed_user do
 30       after_create do |user|
 31         user.confirm!
 32       end
 33     end
 34 
 35   end
105   # SUBTASK
106   factory :subtask do
107     sequence(:name) do |n|
108       "Subtask - #{n}"
109     end
110     task
111   end
112 
113   # DISCUSSION
114   factory :discussion do
115     sequence(:name) do |n|
116       "Discussion No#{n}"
117     end
118     description "Description for the discussion"
119   end

デフォルトがfalseであることを移行で選択したため、ファクトリに「終了」属性が追加されていないことに注意してください。

編集: これは、ユーザーが (ディスカッション コントローラーから) リンクをクリックしたときに、属性を false から true に変更するアクションです。

 33   def finish
 34     if current_user.discussions.include?(@discussion)
 35       @discussion.update_attribute(:finished, true)
 36       redirect_to polymorphic_path([@parent, Discussion])
 37       flash[:notice] = "it worked #{@discussion.finished}"
 38     else
 39       flash[:alert] = 'You must be an admin to do that'
 40     end
 41   end

この @discussion.finished が 37 行目にあるのがわかりますか? save_and_open_page を使用して手動で表示すると、true が返されます...

4

2 に答える 2

1

わかりました、IRC の担当者から回答がありました (急いでいるのが名前です)。とにかく、仕様が渡されない理由は、私が Discussion_for_subtask instance をリロードしなかったためです。以下は動作するコードです...乾杯!

 68     it 'should be able to finish the discussion if they started it/are admin' do
 69       visit subtask_discussions_path(subtask)
 70       click_link "#{discussion_for_subtask.name}"
 71       current_path.should == subtask_discussion_path(subtask, discussion_for_subtask)
 72       click_link 'Finish discussion'  
 73       # the following reload is needed so the instance knows about the change you put it through
 74       discussion_for_subtask.reload   
 75       discussion_for_subtask.finished.should == true
 76       current_path.should == subtask_discussions_path(subtask)
 77     end
于 2012-05-29T15:25:49.857 に答える
0

あなたは「注意してください、デフォルトがfalseであることを移行で選択したので、ファクトリに追加された「終了」属性はありません」と言いました。

したがって、あなたの仕様では、discussion_for_subtask.finished は false です。

discussion_for_subtask.finished.should == trueが失敗すること

于 2012-05-29T13:47:37.490 に答える