使用Aruba和Bundler测试基于Ruby的CLI

Mar*_*eed 9 ruby rspec bundler aruba

我有一个通过Bundler运行的RSpec套件,它使用Aruba测试了许多不同的命令行应用程序.它运行正常...只要被测试的命令本身不是使用Bundler在Ruby中编写的.但我无法弄清楚如何防止RSpec套件的bundler配置干扰自己使用Bundler的命令的执行 - 至少,不是没有极端措施.

我已经试过各种排列unset_bundler_env_varswith_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
Run Code Online (Sandbox Code Playgroud)

我也试过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
Run Code Online (Sandbox Code Playgroud)

肯定有更好的办法.测试套件和被测试的命令都不应该知道或关心对方编写的语言.我使用Aruba和Bundler的测试代码不需要知道如何bundle exec影响过程环境的细节.

那么我做错了什么?我该怎么做?

nra*_*ako 1

它看起来unset_bundler_env_vars 已被弃用并被替换为delete_by_environment_variable需要字符串参数(source)。

您可以尝试before :each { delete_environment_variable('BUNDLE_GEMFILE') }一下您的规格。如果这不起作用,您可能需要遍历 PATH 变量列表来删除每个变量。

在弃用通知中,有一个解决方法,尽管我不确定这会变得多么脆弱。

unset_bundler_env_vars
aruba.environment.clear.update(ENV) 
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。