【发布时间】:2013-02-05 18:53:10
【问题描述】:
所以我有两个规格,我认为它们正在测试相同的东西,但一个失败而另一个通过。我正在开发一个具有重复计划的应用程序。如果用户创建重复的行程,它将继续并为指定的每一天创建新行程。这是第一个失败的测试:
it "makes future trips" do
expect{FactoryGirl.create(:recurring_transportation_trip)}.to change(Trip, :count).by(4)
end
recurring_transportation_trip 创建一个行程,它将通过 after_save 回调进行三个未来行程。此测试失败,并出现错误“count should have changed by 4, but was changed by 1”。
这是另一个通过的测试:
it "makes future trips" do
count = Trip.count
FactoryGirl.create(:recurring_transportation_trip)
Trip.count == count + 4
end
表明存在正确的功能。
第一个测试当然更具可读性,但实际上并没有测试我认为它做了什么。任何人都可以提供并解释原因吗?
-------编辑-------
按要求添加工厂代码:
FactoryGirl.define do
factory :recurring_transportation_trip, :class => :trip do
collection_time "09:00"
estimated_duration "60"
status "Confirmed"
mileage "30"
association :collection, :factory => :location
association :destination, :factory => :location
association :call, :factory => :recurring_call
end
end
对于 recurring_call
FactoryGirl.define do
factory :recurring_call, :class => "Call" do
recurring true
recurring_start_date Date.today
recurring_end_date Date.today + 1.week
recurring_config [1, 3, 5]
end
end
-------EDIT2-------
原来Trip.count == count + 4 实际上并没有断言任何东西,而测试Trip.count.should == count + 4 确实失败了。感谢@BenediktDeicke 指出这一点。
-------EDIT3-------
最后这是我的应用程序代码中的一个错误,我应该从一开始就信任原始测试。感谢所有看过的人。 @boulder 和 @BenediktDeicke 感谢您指出 edit2 中提到的缺少断言。
【问题讨论】:
-
如果你使用
change{Trip.count}而不是change(Trip, :count)这样会发生什么:expect{FactoryGirl.create(:recurring_transportation_trip)}.to change{Trip.count}.by(4)同样的问题? -
@pjam 将
change(Trip, :count)更改为change{Trip.count}给出相同的结果(只是注意到块 =p) -
确实很奇怪,你能发布你工厂的代码吗?
-
@pjam 刚刚编辑了我之前的评论。没注意到
Trip.count在一个街区^.^ -
另一个测试通过了,因为里面没有任何断言。所以很可能这种行为不是你想象的那样。将
Trip.count == count + 4更改为Trip.count.should == count + 4以查看它 - 很可能 - 失败
标签: ruby-on-rails ruby unit-testing rspec factory-bot