Rspec在使用Rails.cache时测试失败,但如果我进行binding.pry,则通过

问题描述 投票:1回答:1

我遇到一个奇怪的问题,我正在测试一个具有使用缓存过程的控制器。测试失败,但是如果我在执行缓存的方法内执行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进行缓存。

在开发环境中完成后,效果很好。我不明白的是为什么它失败了却在添加塞子时通过了?似乎可能与获取缓存所需的时间有关]

UPDATE

使用睡眠,而不是绑定。pry也使测试通过,因此我可以假设这是一个计时问题。到底是什么问题?以及我该如何管理?

ruby-on-rails caching redis rspec ruby-on-rails-5
1个回答
0
投票

我认为这与测试中启用或未启用现金功能有关:

您可以在示例方法的当前实现中设置这样的期望:

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

然后您可以摆脱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兑现,而是测试您的代码是否按需使用它。

© www.soinside.com 2019 - 2024. All rights reserved.