【发布时间】:2017-07-28 08:30:12
【问题描述】:
根据rspec expect message docs,当我们使用如下代码时:
expect(double).to receive(:message).with(argument)
并且argument 响应#===,Rspec 将对实际传入的任何内容调用argument.===。但是如果我想检查一个时间范围是否实际传入,我该怎么办?
例如,我想测试此方法是否使用正确的参数发送正确的消息(已简化):
def in_date_range(range)
activities.by_created_at(range)
end
还有一个类似的测试:
it 'passes correct arguments' do
range = Time.new(0)..(Time.new(0) + 1.hour)
expect(activities).to receive(:by_created_at).with(range)
in_date_range(range)
end
TypeError: can't iterate from Time 失败
我怀疑这是因为哪个 rspec 试图在我的时间范围内调用 #=== 并遇到麻烦。
有没有办法检查我的时间范围实际上是我传入的范围?
我实际上并不是在寻找重叠的时间,而是寻找相同的范围:具有相同的起点和终点。
我想我们可以做到这一点的一种方法是编写一个自定义匹配器,但这似乎是一条不寻常的路线。
编辑
另一种可能的解决方案是将方法分成两部分:
def compute_range(time_in)
(computations)
time1..time2
end
def in_date_range(time_in)
range = compute_range(time_in)
activities.by_created_at(range)
end
然后我可以测试它返回正确范围的计算方法,对于我可以测试的较大方法,它传入正确的输入,并获取较小方法的输出,它从第一个获取结果并传递给另一种方法,避免了消息中检查范围的混淆。
这并没有完全回答这个问题 - 你如何使用 rspec 接收(:消息)检查“接收特定范围”,但现在对我来说已经足够了。
【问题讨论】:
标签: ruby-on-rails ruby rspec