Travis CI 无法 运行 使用 **/*_test.rb 模式进行测试
Travis CI is failing to run tests with **/*_test.rb pattern
我的微型 Ruby 项目测试在我的机器上运行,在私有 VM 上,但在 Travis CI bulid
上失败
项目同时使用 rspec
(+rspec-given
) 和 minitest
此处完整跟踪:https://travis-ci.org/equivalent/code_katas/jobs/61321482
$ bundle exec rake
MiniTest::Unit::TestCase is now Minitest::Test. From /home/travis/.rvm/rubies/ruby
2.1.4/lib/ruby/2.1.0/test/unit/testcase.rb:8:in `<module:Unit>'
/home/travis/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/test/unit.rb:676:in `<class:Runner>': undefined method `_run_suite' for class `Test::Unit::Runner' (NameError)
from /home/travis/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/test/unit.rb:261:in `<module:Unit>'
from /home/travis/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/test/unit.rb:15:in `<module:Test>'
from /home/travis/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/test/unit.rb:7:in `<top (required)>'
from /home/travis/build/equivalent/code_katas/vendor/bundle/ruby/2.1.0/gems/sorcerer-1.0.2/test/sorcerer/resource_test.rb:3:in `require'
#...
错误不言自明MiniTest::Unit::TestCase is now Minitest::Test
。这是由 rspec-given
依赖性 sorcerer
使用 test-unit
(source) 引起的(我的代码在代码中的任何地方都没有引用 test-unit
)
所以我很好奇是否有人知道如何解决这个问题。
就像我说的,它在除 Travis 以外的任何其他地方都有效 CI
问题是 Travis CI 正在将存储库克隆到 /home/travis/build/username/projectname
,然后 bundle install
使用
--deployment
将 gem 安装到 vendor
文件夹的标志
/home/travis/build/username/projectname/verdor
我的 Rakefile
正在使用测试模式 **/*_test.rb
因此 运行 在所有文件夹中进行测试,因此它正在加载 verdor 目录和来自依赖项(外部 gem)的所有测试,其中一些TestUnit
与 MiniTest
不兼容
解决方案是在 Rakefile 中加载测试,而不是使用 pattern
而是使用:
Rake::TestTask.new(:test) do |t|
t.test_files = Dir['**/*_test.rb'].reject do |path|
path.include?('vendor') # tell travis CI to ignore vendor tests
end
end
类似申请RSpec
RSpec::Core::RakeTask.new(:spec) do |t|
t.pattern = Dir.glob('**/*_spec.rb').reject do |path|
path.include?('vendor') # tell travis CI to ignore vendor tests
end
# t.rspec_opts = '--format documentation'
end
我的微型 Ruby 项目测试在我的机器上运行,在私有 VM 上,但在 Travis CI bulid
上失败项目同时使用 rspec
(+rspec-given
) 和 minitest
此处完整跟踪:https://travis-ci.org/equivalent/code_katas/jobs/61321482
$ bundle exec rake
MiniTest::Unit::TestCase is now Minitest::Test. From /home/travis/.rvm/rubies/ruby
2.1.4/lib/ruby/2.1.0/test/unit/testcase.rb:8:in `<module:Unit>'
/home/travis/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/test/unit.rb:676:in `<class:Runner>': undefined method `_run_suite' for class `Test::Unit::Runner' (NameError)
from /home/travis/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/test/unit.rb:261:in `<module:Unit>'
from /home/travis/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/test/unit.rb:15:in `<module:Test>'
from /home/travis/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/test/unit.rb:7:in `<top (required)>'
from /home/travis/build/equivalent/code_katas/vendor/bundle/ruby/2.1.0/gems/sorcerer-1.0.2/test/sorcerer/resource_test.rb:3:in `require'
#...
错误不言自明MiniTest::Unit::TestCase is now Minitest::Test
。这是由 rspec-given
依赖性 sorcerer
使用 test-unit
(source) 引起的(我的代码在代码中的任何地方都没有引用 test-unit
)
所以我很好奇是否有人知道如何解决这个问题。
就像我说的,它在除 Travis 以外的任何其他地方都有效 CI
问题是 Travis CI 正在将存储库克隆到 /home/travis/build/username/projectname
,然后 bundle install
使用
--deployment
将 gem 安装到 vendor
文件夹的标志
/home/travis/build/username/projectname/verdor
我的 Rakefile
正在使用测试模式 **/*_test.rb
因此 运行 在所有文件夹中进行测试,因此它正在加载 verdor 目录和来自依赖项(外部 gem)的所有测试,其中一些TestUnit
与 MiniTest
解决方案是在 Rakefile 中加载测试,而不是使用 pattern
而是使用:
Rake::TestTask.new(:test) do |t|
t.test_files = Dir['**/*_test.rb'].reject do |path|
path.include?('vendor') # tell travis CI to ignore vendor tests
end
end
类似申请RSpec
RSpec::Core::RakeTask.new(:spec) do |t|
t.pattern = Dir.glob('**/*_spec.rb').reject do |path|
path.include?('vendor') # tell travis CI to ignore vendor tests
end
# t.rspec_opts = '--format documentation'
end