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)的所有测试,其中一些TestUnitMiniTest

不兼容

解决方案是在 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