簡體   English   中英

Rspec 測試在使用 Rails.cache 時失敗,但如果我執行 binding.pry 則通過

[英]Rspec tests failing when using Rails.cache, but pass if I do a binding.pry

我有一個奇怪的問題,我正在測試一個 controller,它有一個使用緩存的過程。 測試失敗,但如果我在執行緩存的方法中執行binding.pry ,則測試通過。

包含緩存和 binding.pry 的方法示例:

def method_example:
  data = Rails.cache.fetch(cache_key) do
    ProcedureService.new(params).generate
  end

  binding.pry

  data
end

測試示例:

  it "reverts record amount" do
    expect(record.amount).to eq((original_amount + other_amount).to_d)
  end

緩存是通過 redis_store 完成的。

在開發環境中完成后,它工作正常。 我不明白為什么它在添加塞子時失敗但通過了? 似乎可能與獲取緩存所需的時間有關

更新

使用 sleep 而不是 binding.pry 也使測試通過,所以我可以假設這是一個時間問題。 究竟是什么問題? 我該如何管理它?

我認為這與您的測試中啟用或未啟用兌現有關:

您可以在示例方法中使用當前實現設置這樣的期望:

expect(Rails).to receive_massage_change(:cashe, :fetch).and_return(expected_value)

您還可以將ProcedureService實例注入方法並對其設置期望,如下所示:

procedure_service_instance = instance_double('ProcedureService', generate: some_value_you_want_to_be_returned)

expect(procedure_service_instance).to receive(:generate)

如果您像這樣制作示例方法:

def method_example
  data = Constant.fetch_from_cashe(cache_key)
  procedure_service.generate
  data
end

那么你可以 git 擺脫receive_message_chain期望並使用:

expect(Constant).to receive(:fetch_from_cashe).with(cashe_key).and_return(expected_value)
expect_any_instance_of(ProcedureService).to receive(:generate){ some_fake_return_value }

你也可以在你的測試中啟用緩存,檢查這些鏈接: link1link2link3

我不確切知道您的原件是在哪里以及如何編寫的,但是根據您提供的示例方法,我認為對發送的方法設置期望值就可以了。 請注意,您的目標不是測試 Rails 兌現,而是測試您的代碼是否按照您的意願使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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