【发布时间】:2017-06-27 06:45:21
【问题描述】:
考虑在 gem 中使用的以下代码,它是我们主应用程序的依赖项:
module Module1
module Module2
module EnvInit
def stub_env(name, value)
stub_const('ENV', ENV.to_hash.merge(name => value))
end
end
end
end
RSpec.configure do |config|
config.include Module1::Module2::EnvInit
config.before(:each) do
stub_env('NAME', 'John Doe')
end
end
我们的主应用程序使用 .env 文件作为我们的环境变量。但是,上面的代码出于某种原因覆盖了ENV['NAME']。我们无权访问这个 gem,所以为了让我们的测试持续下去,我想在调用 stub_env 时进行模拟,如下所示:
before do
# tried this with `allow_any_instance_of` as well
allow(Module1::Module2::EnvInit).to receive(:stub_env).with('NAME','John Wayne')
end
或
it "should match name to John Wayne" do
EnvInit.any_instance.should_receive(:stub_env).with('NAME','John Wayne')
end
等等。我尝试了各种模拟方式,但我以stub_env 为目标的尝试都没有奏效。所有stub_env 看到的是John Doe。
简单地说,我希望stub_env 通过模拟接收value == John Wayne。
【问题讨论】:
-
RSpec.configure部分可能来自 gem 的一个规范文件。您不应该在您的应用程序中包含这些文件。如果包含 gem 会自动添加 gem 的测试设置,这是一个严重的错误,应该修复。
标签: ruby-on-rails ruby unit-testing rspec