Ruby on rails 测试失败,即使它正在测试的东西正在通过
我有一些多态性属于项目、任务和子任务的讨论。当用户单击“完成讨论”链接时,讨论模型的布尔属性将从false变为true 我已经在下面的规范中对其进行了TDD,尽管布尔值确实发生了变化,但规范没有说明,预期false为true 这是下面的规格。它在第73行失败,说“预计为假”为真。所以我的想法是我写错了规范Ruby on rails 测试失败,即使它正在测试的东西正在通过,ruby-on-rails,testing,rspec,integration-testing,factory-bot,Ruby On Rails,Testing,Rspec,Integration Testing,Factory Bot,我有一些多态性属于项目、任务和子任务的讨论。当用户单击“完成讨论”链接时,讨论模型的布尔属性将从false变为true 我已经在下面的规范中对其进行了TDD,尽管布尔值确实发生了变化,但规范没有说明,预期false为true 这是下面的规格。它在第73行失败,说“预计为假”为真。所以我的想法是我写错了规范 5 let!(:user) { FactoryGirl.create(:confirmed_user) } 6 let!(:project) { FactoryGirl.cre
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
注意,我没有在工厂中添加“finished”属性,因为我在迁移中选择默认值为false
编辑:这是当用户单击链接(从讨论控制器)时将属性从false更改为true的操作:
你看到第37行的@discussion.finished了吗?当我使用save_和open_页面手动查看时,返回true…您说“注意,我没有在工厂中添加'finished'属性,因为我在迁移中选择默认值为false。”
因此,在规格讨论中,对于子任务,finished为false
子任务的行
讨论\u.finished.should==true
失败了好的,我从IRC的一个家伙那里得到了答案(名字是Rush)无论如何,规范未通过的全部原因是我没有为子任务实例重新加载讨论。下面是工作的代码。。。干杯
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
是的,但即使我在discussion factory中完成了“false”,我也会收到相同的规范失败消息。但是,您规范会检查子任务的discussion\u.finished.should是否为true。这是错误的。因此,如果finished应为false,则将子任务的行替换为
discussion\u。finished.should==false
,但单击链接后会触发“finish discussion”完成操作(您可以在问题的编辑部分中看到代码)。该操作确实会将“finished”属性更改为true,但规范仍然失败…尝试运行tail-f log/test.log
然后运行规范并检查finished attr是否已更新。规范失败的原因是什么?应该有很多。
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
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