Rake可以在单独的Ruby实例中运行每个测试吗?

时间:2014-11-24 11:00:49

标签: ruby rake rake-test

我有一个非常简单的Rakefile来测试一个小的Ruby gem。它看起来像这样:

Rake::TestTask.new
task :default => :test

它调用两个定义具有相同名称的常量的测试。这导致第二次测试输出错误,如下所示:

warning: already initialized constant xxxxx

原因是因为Rake在单个Ruby实例中执行所有测试:

/usr/bin/ruby -I"lib" -I"/usr/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib" "/usr/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/rake_test_loader.rb" "test/test*.rb"

我应该如何指定每个测试应该在一个单独的Ruby实例中运行?

我已经实现了如下所示,但我想知道是否有更好的方法,因为这个解决方案不适合大量测试。

Rake::TestTask.new(:one) { |t| t.test_files = %w(test/test_one.rb) }
Rake::TestTask.new(:two) { |t| t.test_files = %w(test/test_two.rb) }
task :default => [:one, :two]

1 个答案:

答案 0 :(得分:0)

您可以在Rake::TestTask中定义一个测试任务,而不是使用Rakefile,该测试任务循环遍历每个测试文件并使用sh运行它们,如下所示:

task :test do
  libs = ['lib', 
          '/usr/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib', 
          '/usr/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/rake_test_loader.rb']
  test_files = FileList['test/**/test*.rb']

  test_files.each do |test_file|
    includes = libs.map { |l| "-I#{l}"}.join ' '
    sh "ruby #{includes} #{test_file}"
  end
end