簡體   English   中英

Rspec 匹配器,用於 hash 值中的隨機數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM