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
.
在 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
.