我有一个通过 Bundler 运行的 RSpec 套件,它正在使用 Aruba 测试许多不同的命令行应用程序。它工作正常......只要被测试的命令本身不是使用 Bundler 用 Ruby 编写的。但是我不知道如何防止 RSpec 套件的捆绑器配置干扰本身使用捆绑器的命令的执行——至少,不是没有极端措施。
我尝试了 和 的各种排列unset_bundler_env_vars
,with_clean_env
但无济于事。这是我认为可行的技术示例:
describe 'my ruby app' do
before :each { unset_bundler_env_vars }
it 'should work' do
Bundler.with_clean_env { run_simple ruby_command_name }
end
end
我也尝试unset_bundler_env_vars
不使用with_clean_env
,反之亦然,以防它们相互干扰。没有骰子。
我让它工作的唯一方法是手动按摩 Aruba 的环境副本,如下所示:
before :all do
aruba.environment.tap do |env|
if env.include? 'BUNDLE_ORIG_PATH' then
env['PATH'] = env['BUNDLE_ORIG_PATH']
%w(BUNDLE_BIN_PATH BUNDLE_GEMFILE BUNDLE_ORIG_PATH GEM_HOME RBENV_DIR
RBENV_HOOK_PATH RUBYLIB RUBYOPT).each do |key|
env.delete key
end
end
end
end
肯定有更好的办法。测试套件和被测试的命令都不应该知道或关心对方是用什么语言编写的。我使用 Aruba 和 Bundler 的测试代码不需要知道如何bundle exec
影响进程环境的细节。
那么我做错了什么?我应该怎么做?