从rake文件执行另一个应用程序的测试

时间:2011-11-14 10:15:30

标签: ruby gem cucumber rake bundler

我正在尝试在另一个项目的rake文件中为项目执行黄瓜测试。

目前我正在尝试这个:

system "cd /path/to/project;rvm use --create 1.9.2-p290@test; cucumber features/test.feature"

这适用于cd,如果我在rvm使用后运行哪个ruby,rvm似乎有效...但问题是黄瓜宝石似乎是从当前文件夹调用的(不是应用程序来测试文件夹) )。

我得到的错误是:

cucumber is not part of the bundle. Add it to Gemfile. (Gem::LoadError)

它似乎使用黄瓜的本地gemset版本而不是@test gemset。

对此有何想法?

还是有更好的方法为另一个依赖rvm& amp;的项目运行黄瓜测试一个不同的捆绑?

2 个答案:

答案 0 :(得分:4)

我也一直试图做同样的事情;从另一个“控制”应用程序内部运行应用程序的测试(或任何rake任务)。

原因:(只是因为我没有得到“为什么在地球上?”)

我正在尝试构建一个应用程序(比如cruisecontrol.rb),它可以监视,安排和查看一组应用程序的规范。

在使用cruisecontrol的源头进行一些挖掘之后,我发现Bundler提供了一个解决方案;

Bundler.with_clean_env do 
  system "rake spec"
end

https://github.com/thoughtworks/cruisecontrol.rb/blob/master/lib/platform.rb

的第56行

跳出捆绑包,命令在没有控制应用程序的宝石的情况下运行。

但是最有可能,该命令使用bundle exec然后停止工作。

Bundler.with_clean_env { system "bundle exec rake spec" }

你回到了完全相同的问题。这是由一些仍然存在并由子shell继承的bundle变量引起的。完整(非常好)的解释here

解决方案是更改像这样的Bundler上的with_clean_env方法;

BUNDLER_VARS = %w(BUNDLE_GEMFILE RUBYOPT BUNDLE_BIN_PATH)
module Bundler
  def self.with_clean_env &blk
    bundled_env = ENV.to_hash
    BUNDLER_VARS.each{ |var| ENV.delete(var) }
    yield
  ensure
    ENV.replace(bundled_env.to_hash)     
  end
end

来自here

的代码

我把它放在我的控制应用程序的environment.rb中(它可能应该在初始化程序中?)现在我可以在控制应用程序中运行另一个应用程序的规范。

#in control app
result = nil
Dir.chdir(test_app_path) #move into test app
Bundler.with_clean_env { result = `bundle exec rake spec` } #run test apps specs
puts result #display result inside control app

答案 1 :(得分:0)

将脚本中的;更改为&&似乎有效。