gpt4 book ai didi

ruby-on-rails - 'rake spec' 不与自定义 RAILS_ENV 一起运行,但 'rspec' 和 'bundle exec rspec' 可以

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:44 26 4
gpt4 key购买 nike

所以我遇到了一个奇怪的问题。我为运行 linux 的 CI 服务器设置了自定义 Rails 环境。环境加载正确,测试确实在 CI 服务器上运行,但前提是我使用 bundle exec rspec 而不是 bundle exec rake spec 运行它们 bundle 执行 rake

当测试没有运行时,它们仍然返回退出代码 0,并且 CI 服务器假定构建成功,即使理论上构建可能被破坏。

相同的行为发生在我运行 OS X 的机器上。

这是一个包含所有不同测试用例的控制台 session ,以更好地说明正在发生的事情。

未指定 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 中时,rakerake spec 都不会在 RAILS_ENV=ci 中运行但是 bundle exec rspec 工作正常。

有人能解释一下这是怎么回事吗?我找不到一种方法使它具有任何逻辑意义。我是否偶然发现了 Rails 的 rake 任务中的错误?

编辑:回应haradwaith's answer :你提出了一些非常好的观点,第一点是正确的(它直接运行 rspec 可执行文件),但我不能说你的回答充分解释了正在发生的事情。

  1. 此行为并非特定于我的机器,在每次测试前运行 bundle install 的干净 ruby​​:2.2 Docker 容器上的行为是相同的。由于它每次都会加载一个干净的容器,因此“旧”版本的 gems 无法进入。

  2. 为了进一步复制 Docker 容器的“干净状态”,我刚刚在我的机器上用一个空的 gemset 进行了测试以排除 gem 版本冲突并得到了相同的结果:http://pastebin.com/9u3MJaFw

  3. 我的 Gemfile 确实没有提到 :ci 组。如果未加载 rspec-rails gem,则没有参数的 RAILS_ENV=ci rake 不会将 Rspec 作为默认 Rake 任务运行,但它显然可以。我们还可以看到它有不同的行为,具体取决于它是否与 bundle exec 一起运行。我不相信使用 bundle exec 运行会“卸载” rspec-rails 如果在没有 bundler 的情况下以某种方式设法自动加载它。

  4. 如果 rspec 和/或 rspec-rails 没有被加载,rake 将失败,退出代码为 other比 0,并吐出如下内容:

    ~/not-myapp $ touch Rakefile

    ~/not-myapp $ rake 规范

    rake 中止!

    不知道如何构建任务“spec”

    (通过使用 --trace 运行任务查看完整跟踪)

最佳答案

几点:

rspec

rspecbundle exec rspec 始终运行您的测试,因为它直接使用 rspec 可执行文件。

rake

gem rspec-rails 定义了一些 rake 任务,包括 spec 任务。但是,只有在使用的环境中加载了 rspec gem 后,rake 才能运行此任务。如果你的 Gemfile 中有这样的东西:

group :test, :development do
gem 'rspec-rails', '~> 3.0'
end

spec 任务命令仅适用于测试和开发环境,不适用于 RAILS_ENV=ci

bundle

建议始终使用 bundle exec 来运行 ruby​​ 可执行文件。来自Bundler website :

In some cases, running executables without bundle exec may work, if the executable happens to be installed in your system and does not pull in any gems that conflict with your bundle.

However, this is unreliable and is the source of considerable pain. Even if it looks like it works, it may not work in the future or on another machine.

如果没有 bundle exec,可执行文件可能会通过混合其他 gem 或机器上已安装的 gem 版本而出现意外或不一致的行为。

在您的情况下,RAILS_ENV=ci rake 有效而 RAILS_ENV=ci rake spec 无效的事实可能是由于与旧版本 rspec-spec,或由其他一些定义其他默认 rake 任务的 gem。

在任何情况下,这种行为都不是错误,可能是您的机器特有的。我建议只使用 bundle exec rspec 来运行测试。


编辑:回应您的评论:

4 - 即使 rspec-rails 未加载,rake spec 也不会崩溃,这是一个棘手的部分。当您尝试运行任务 example 时,rake 首先在加载的 rakefile 中搜索任务 example。如果找不到,它将检查文件 example 是否存在于您的项目中。如果是,它将尝试从该文件执行任务。

在您的例子中,文件 spec 存在于您的项目中,并且是一个目录。所以当你执行 rake spec 时,如果任务 spec 不存在,它将加载你的 spec 文件,并且在存在之前什么也不做没有任务要在其中运行。

这就是为什么 rake blublu 会失败,但 rake specrake app 不会。

关于ruby-on-rails - 'rake spec' 不与自定义 RAILS_ENV 一起运行,但 'rspec' 和 'bundle exec rspec' 可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32217900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com