ruby-on-rails - 使用 Rails.cache 时 Rspec 测试失败,但如果我执行 binding.pry 则通过
问题描述
我有一个奇怪的问题,我正在测试一个控制器,该控制器有一个使用缓存的过程。测试失败了,但是如果我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
那么你可以摆脱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 兑现,而是测试您的代码是否按照您的意愿使用它。
推荐阅读
- javascript - 有没有“最好”的方式来承诺和调用方法函数?
- datepicker - react-semantic-ui-datepickers 在 redux-form 中没有表单值
- azure - What is the difference between Continuous deployment trigger and Pull request trigger?
- html - 位置未触发溢出:绝对
- python - 将字符串转换为十六进制并在 Python 中通过串行发送
- java - 递归问题的测试用例中的错误
- assembly - 优化第 7 代英特尔酷睿视频 RAM 中的递增 ASCII 十进制计数器
- python - 如何使用 inspectdb 命令从 oracle 表同义词创建 Django 模型
- java - Spring execption:org.hibernate.tool.schema.spi.CommandAcceptanceException: Error execution DDL "create table post
- fluentd - FluentD 配置以索引弹性日志中的所有字段