【发布时间】:2015-11-19 23:28:18
【问题描述】:
所以我遇到了一个奇怪的问题。我为运行 linux 的 CI 服务器设置了自定义 Rails 环境。环境被正确加载,测试确实在 CI 服务器上运行,但前提是我使用 bundle exec rspec 而不是 bundle exec rake spec 或 bundle exec rake 运行它们。
当测试不运行时,它们仍然返回退出代码 0 并且 CI 服务器假定构建成功,即使理论上构建可能会被破坏。
在我运行 OS X 的机器上发生了相同的行为。
这是一个包含所有不同测试用例的控制台会话,以更好地说明正在发生的事情。
未指定 RAILS_ENV
~/myapp $ rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 4.34 seconds (files took 3.1 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.8 seconds (files took 3.36 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ rspec
...............................................
Finished in 3.87 seconds (files took 2.98 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.9 seconds (files took 3.03 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.64 seconds (files took 2.97 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rspec
...............................................
Finished in 3.75 seconds (files took 2.95 seconds to load)
47 examples, 0 failures
一切都按预期进行
使用标准 RAILS_ENV
结果与测试、开发或生产相同~/myapp $ RAILS_ENV=test rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.86 seconds (files took 3.07 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.9 seconds (files took 3.02 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test rspec
...............................................
Finished in 3.82 seconds (files took 2.98 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test bundle exec rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.76 seconds (files took 2.91 seconds to load)
47 examples, 0 failures
# ------
~/myapp $ RAILS_ENV=test bundle exec rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.83 seconds (files took 2.99 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test bundle exec rspec
...............................................
Finished in 3.83 seconds (files took 3.11 seconds to load)
47 examples, 0 failures
再次一切都很好,花花公子。
使用自定义 RAILS_ENV
~/myapp $ RAILS_ENV=ci rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.73 seconds (files took 3.03 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=ci rake spec
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci rspec
...............................................
Finished in 7.82 seconds (files took 2.96 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=ci bundle exec rake
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci bundle exec rake spec
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci bundle exec rspec
...............................................
Finished in 7.77 seconds (files took 2.8 seconds to load)
47 examples, 0 failures
由于 CI 服务器设置的性质,我必须在 bundle exec 内运行测试。但令我难以置信的是,在我的机器上RAILS_ENV=ci rake 可以完美运行,而RAILS_ENV=ci rake spec 却无法运行。
但是当我将它们包装在 bundle exec 中时,rake 和 rake spec 都不会在 RAILS_ENV=ci 中运行,但 bundle exec rspec 工作正常。
有人可以解释这里发生了什么吗?我找不到任何合乎逻辑的方法。我是否偶然发现了 Rails 的 rake 任务中的错误?
编辑:回复haradwaith's answer: 你提出了一些非常好的观点,第一点是正确的(它直接运行 rspec 可执行文件),但我不能说你的回答充分解释了正在发生的事情。
此行为并非特定于我的机器,在每次测试前运行 bundle install 的干净 ruby:2.2 Docker 容器上的行为是相同的。由于它每次都加载一个干净的容器,因此“旧”版本的 gem 无法潜入。
-
为了进一步复制 Docker 容器的“干净状态”,我刚刚在我的机器上使用空 gemset 进行了测试,以排除 gem 版本冲突并得到相同的结果:http://pastebin.com/9u3MJaFw
我的 Gemfile 确实没有提到
:ci组。如果rspec-railsgem 没有被加载,那么不带参数的RAILS_ENV=ci rake不会将Rspec 作为默认的Rake 任务运行,但它显然会运行。我们还可以看到它具有不同的行为,具体取决于它是否使用bundle exec运行。我不相信使用bundle exec运行会“卸载”rspec-rails,如果在没有bundler的情况下运行它会设法自动加载它。-
如果
rspec和/或rspec-rails没有被加载,rake将失败并出现0以外的退出代码,并输出如下内容:~/not-myapp $ touch Rakefile
~/not-myapp $ rake 规范
rake 中止!
不知道如何构建任务'spec'
(通过使用 --trace 运行任务查看完整跟踪)
【问题讨论】:
-
你能分享你的 Rakefile 吗?我无法在我的计算机上重现“rake”和“rake spec”之间的区别。
-
我还在我的回复编辑中回复了您的第四条评论。
-
我的 Rakefile 是 rails 标准文件,由以下两行组成:1)
require File.expand_path('../config/application', __FILE__)和 2)Rails.application.load_tasks
标签: ruby-on-rails ruby rspec rake bundler