按照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發生!我不知道爲什麼我沒有檢查。這流露出一些光芒。編輯指定時間實例的問題,雖然我不明白時間迭代的相關性 –