[英]Rspec matcher for random number in a hash value
我正在嘗試修復一個測試,但是因為我們隨機運行測試, change_requests
最終是隨機的,所以 before do 塊中預期的 hash 總是以失敗告終。
錯誤示例:
Diff:
@@ -1,4 +1,4 @@
-:change_requests => [0, 0],
+:change_requests => [23, 24],
測試:
let(:expected_hash) do
{
from_admin_user: user.first_name,
station_id: station.id,
ten_minutes_before_reminder: false,
one_hour_after_reminder: false,
change_requests: [0, 0],
one: requests[0][:new_price],
two: 'NO CHANGE',
three: 'NO CHANGE',
four: requests[1][:new_price],
price_change_at_time: nil
}
end
before do
expect(PriceChangeService).to receive(:new) do |hash|
expect(hash).to eq expected_hash
price_change_service
end
end
是否可以通過例如以某種方式將隨機數匹配器添加到change_requests
值來解決此問題?
您可以使用以下方法刪除隨機密鑰:
expect(hash.except(:change_requests )).to eq
expected_hash.except(:change_requests)
或存根生成change_requests
的方法以使其具有確定性。
由於change_requests
的值是動態的,所以我們基本上需要檢查兩件事:
1) change_requests
是一個包含兩個元素的數組
2)hash的rest,除了change_requests
如預期(這里,change_requests從expected_hash聲明中去掉)
我們可以通過在新創建的PriceChangeService
object 上使用reject
方法來檢查除change_requests
的所有鍵和值來實現這一點。 此外,我們需要檢查第 (1) 點中提到的change_requests
值。
這可以按如下方式完成:
before do
expect(PriceChangeService).to receive(:new) do |hash|
expect(hash.reject{|k, v| k == : change_requests}).to eq(expected_hash)
expect(hash[:change_requests].class).to eq(Array)
expect(hash[:change_requests].length).to eq(2)
price_change_service
end
end
您還可以檢查預期的元素類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.