Mock Rails 4 应用程序配置自定义值

Mock Rails 4 application config custom value

在 Rails::Application 中,我使用...添加自定义配置...

config.x.cache_config = config_for(:cache)

在我的测试中,我想看看使用它的代码如何根据 cache.yml 中定义的配置进行操作。要在我的 rspec 测试中设置各种条件,我想做类似...

allow(Rails.application.config.x).to recieve(:cache_config).and_return({})

但这行不通。它收到一条错误消息

#<Rails::Application::Configuration::Custom ... > does not implement: cache_config

经过大量的挖掘和撬动测试,我明白了这一点。

简答:

allow(Rails.application.config.x).to receive(:method_missing).with(:cache_config).and_return({})

此声明中的所有内容都必须准确,除了...

  • :cache_config 替换为自定义配置密钥的名称
  • and_return({}) 中的 {} 替换为您要为键设置的模拟值

更长的答案:

如果您想深入了解这是为什么,因为它一点也不明显,请查看代码...

如果这对使用 Mocha 的人有帮助,我最终在一个助手中做了这个

Rails.application.config.x.stubs(:my_config).returns(true)
yield
Rails.application.config.x.unstub(:my_config)

上面的 method_missing 技巧由于某种原因没有奏效(猜测与存根实现方式的差异有关),失败并显示有关 Configuration::Custom [=18] 的错误消息=] 没有响应 method_missing 第一次被不同的配置引用。

添加到上面的答案,如果你想存根嵌套配置,那么你必须确保你正在 allow-ing 将配置中的倒数第二部分 receive(:method_missing),因此:

allow(Rails.application.config.x.foo.bar).to receive(:method_missing).with(:foobar).and_return(:baz)

以上代码将 Rails.application.config.x.foo.bar.foobar 配置存根到 return :baz.