我有一些单元测试类,我有一个rake任务来运行这些单元测试。然而,我遇到了一个问题,当测试通过rake运行时,使用的是旧版本的minitest。我怎样才能让rake使用更新的版本?
如果我使用Minitest::Test
子类,当测试直接通过ruby
运行时,它运行良好命令行。但是,如果我使用以下rake任务:
require 'rake/testtask'
Rake::TestTask.new do |t|
t.pattern = 'tests/**/*_test.rb'
end
当我使用puts MiniTest::Unit::VERSION
检查最小版本时,它在使用ruby运行时打印5.5.0,但在使用rake运行时打印4.3.2。(当使用gem list minitest -d
时,4.3.2版本被列为默认)
我想使用新版本的minitest的原因是,当我使用Ruby 2.0直接运行单元测试时,我得到以下警告:
MiniTest::Unit::TestCase is now Minitest::Test.
但是,如果我将MiniTest::Unit::TestCase
更改为Minitest::Test
,当我使用rake运行测试时,我会得到以下错误:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/ext/module.rb:36:in `const_missing': uninitialized constant MiniTest::Test (NameError)
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/minitest/unit.rb:28:in `const_missing'
我想避免需要对系统配置进行任何更改,因为我希望这些测试在默认的OS X ruby安装上运行。
使用gem 'minitest', '=5.5.0'
不会改变使用的最小测试版本
可能性#1:使用bundle exec
运行Rake来强制它使用由Bundler管理的Minitest版本:
bundle exec rake test
可能性#2:为项目的Rake创建一个binstub,它会自动加载你的bundle:
bundle binstub rake
之后,您应该能够运行没有bundle exec
的Rake以获得相同的结果。
警告:这对我最近使用的Ruby环境管理器有效,但如果它不适合你,你可能需要谷歌周围的解决方案。
Ruby很难从gem而不是标准库加载minitest,所以我们需要给它一点帮助。将以下内容添加到helper或rake任务中:
gem "minitest"
告诉ruby使用gem版本。只是要确保在minitest需要之前添加它。