0

我有一个非常简单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]
4

1 回答 1

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
于 2015-08-30T05:24:12.607 回答