按照rspec expect message docs,当我们使用如下代码:Rspec的期望接收(...)与(TIME_RANGE)
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试图在我的时间范围内拨打#===
并遇到麻烦。
有没有办法检查我的时间范围实际上是我通过的范围?
我实际上并不是在寻找重叠的时间,而是范围是相同的:它们具有相同的开始点和结束点。
我想我们可以做到这一点的一种方式是编写自定义匹配器,但它似乎是一个不寻常的路线。
EDIT
另一种可能的解决方案是将方法分成两个部分:
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 receive(:message)检查'接收特定范围',但现在对我来说已经足够了。
哦有趣的完全发生
A发生!我不知道为什么我没有检查。这流露出一些光芒。编辑指定时间实例的问题,虽然我不明白时间迭代的相关性 –