【问题标题】:Testing Ruby-based CLIs with Aruba and Bundler使用 Aruba 和 Bundler 测试基于 Ruby 的 CLI
【发布时间】:2017-01-06 00:00:31
【问题描述】:

我有一个通过 Bundler 运行的 RSpec 套件,它正在使用 Aruba 测试许多不同的命令行应用程序。它工作正常……只要被测试的命令本身不是使用 Bundler 用 Ruby 编写的。但我不知道如何防止 RSpec 套件的捆绑器配置干扰本身使用 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

我也尝试了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 如何影响进程环境的细节。

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

【问题讨论】:

  • 我在警卫中遇到过这种情况,运行 appbundled 之类的工具,例如 test-kitchen。我希望你能得到一个解决方案,因为它很烦人!

标签: ruby rspec bundler aruba


【解决方案1】:

它看起来像 unset_bundler_env_vars is deprecated 并被 delete_by_environment_variable 替换,这需要一个字符串参数 (source)。

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

在弃用通知中,有一个变通办法,但我不确定这会变得多么脆弱。

unset_bundler_env_vars
aruba.environment.clear.update(ENV) 

希望这会有所帮助。

【讨论】:

  • 感谢您的帮助。不幸的是,仅仅取消设置 BUNDLER_GEMFILE 似乎并不总是足够的,尤其是在修改 PATH 的情况下,但delete_environment_variable 确实比手动查看aruba.environment 更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多