rspec预计不会达到我的预期

时间:2013-02-05 18:53:10

标签: ruby-on-rails ruby unit-testing rspec factory-bot

所以我有两个规格我认为正在测试相同的东西但是一个失败而另一个失败。我正在开发一个具有重复计划的应用程序。如果用户创建了一个重复出现的行程,它将继续为指定的每一天创建新的行程。这是第一次失败的测试:

it "makes future trips" do
  expect{FactoryGirl.create(:recurring_transportation_trip)}.to change(Trip, :count).by(4)
end

recurring_transportation_trip创建一个旅程,通过after_save回调进行三次未来旅行。此测试失败,错误“计数应该已更改为4,但已更改为1”。

这是另一个通过的测试:

it "makes future trips" do
  count = Trip.count
  FactoryGirl.create(:recurring_transportation_trip)
  Trip.count == count + 4
end

显示正确的功能。

第一个测试肯定更具可读性,但实际上并没有测试我认为它的作用。任何人都可以提供和解释原因吗?

------- ------- EDIT

按要求添加工厂代码:

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中提到的缺乏断言。

2 个答案:

答案 0 :(得分:1)

你的第二次测试实际上没有测试任何东西,因为它没有定义任何期望。

这条线 Trip.count == count + 4 只是一个计算结果为false的表达式。

您要做的是:

Trip.count.should == count + 4

无论如何,第一次测试是你应该信任的;它告诉您,您需要调查的应用程序代码中存在错误。

答案 1 :(得分:0)

by by chain matcher是预期应该改变的数量。

expect{FactoryGirl.create(:recurring_transportation_trip)}.to change(Trip, :count).by(1)

这是documentation