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