ruby-on-rails - 使用 Rails.cache 时 Rspec 测试失败,但如果我执行 binding.pry 则通过

标签 ruby-on-rails caching redis rspec ruby-on-rails-5

我遇到了一个奇怪的问题,我正在测试一个 Controller ,该 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 实例注入(inject)到该方法中,并像这样对其设置期望值:

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 }

您还可以在测试中启用缓存,检查这些链接:link1 , link2 , link3

我不确切知道您的原件是在哪里以及如何编写的,但是根据您提供的示例方法,我认为对发送的方法设置期望值可以解决问题。请注意,您的目标不是测试 rails cashing,而是测试您的代码是否按照您的意愿使用它。

关于ruby-on-rails - 使用 Rails.cache 时 Rspec 测试失败,但如果我执行 binding.pry 则通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61016948/

相关文章:

ruby-on-rails - 设置:defaults for route cluster

caching - 在 Symfony 中防止 Doctrine 的查询缓存

c# - 如何通过 SignalR 将遥测数据推送到客户端?

amazon-web-services - AWS Redis - 启用/禁用集群模式。它是如何分配流量的?

ServiceStack 的 Azure Redis 缓存始终在增加

mysql - 检查模型范围内是否有 locale_restriction

ruby-on-rails - 使用 Phonegap 作为 Rails 3 应用程序的本地容器

ruby-on-rails - Rails 3 - 重构 ruby 条件

python - 如何在 Sqlalchemy orm session 中正确禁用缓存?

php - 缓存和竞争条件