Rails和RSpec:`rake spec`运行所有规格两次

时间:2014-01-01 20:34:45

标签: ruby-on-rails rspec-rails

我使用RSpec设置了一个新的Rails 4应用程序。但是在运行rake rspec时,所有示例都会运行两次:

rake spec
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
/Users/josh/.rvm/rubies/ruby-2.0.0-p353/bin/ruby -S rspec ./spec/controllers/dashboards_controller_spec.rb ./spec/models/member_spec.rb ./spec/requests/members_spec.rb ./spec/routing/members_routing_spec.rb
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
 11/11 |============================================ 100 ============================================>| Time: 00:00:00 

Finished in 0.21233 seconds
11 examples, 0 failures

Randomized with seed 15954

/Users/josh/.rvm/rubies/ruby-2.0.0-p353/bin/ruby -S rspec ./spec/controllers/dashboards_controller_spec.rb ./spec/models/member_spec.rb ./spec/requests/members_spec.rb ./spec/routing/members_routing_spec.rb
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
 11/11 |============================================ 100 ============================================>| Time: 00:00:00 

Finished in 0.18831 seconds
11 examples, 0 failures

Randomized with seed 24248

我已经找到了一些其他(旧的)问题,但找不到我的解决方案。我该如何尝试调试这个?运行rspec就像一个魅力,但我很想知道这里有什么问题。

这是我的spec_helper.rbhttps://github.com/jmuheim/transition/blob/master/spec/spec_helper.rb

这是原始的Rails项目: https://github.com/jmuheim/transition

更新

我发现spec rake任务似乎被定义了两次(注意分隔每个任务描述的/):

$ rake -T | grep spec
...
rake spec                               # Run all specs in spec directory (excluding plugin specs) / Run RSpec code examples
...

其中一个用Run all specs in spec directory (excluding plugin specs)描述,一个用Run RSpec code examples描述。

Run RSpec code examples似乎来自rspec/core/rake_task.rbRun all specs in spec directory (excluding plugin specs)似乎来自rspec/rails/tasks/rspec.rake

在我看来,只有其中一个应该存在?!

更新2

rspec-railstest组中的development似乎存在问题。我在这里添加了一个问题:https://github.com/rspec/rspec-rails/issues/904

6 个答案:

答案 0 :(得分:3)

对我而言,这是由于我的.rspec文件中存在重复条目。无法判断这是否是问题,因为.git文件位于.gitignore中,但基本上如果你这样做:

-- format progress
-- format documentation

在您的rspec文件中,您将看到测试输出两次。

答案 1 :(得分:2)

config.around(:each) do |example|
     ......

    DatabaseCleaner.start
    example.run # <================================= remove this
    DatabaseCleaner.clean
.......
  end

您需要从规范帮助中删除example.run来电。另外,设置数据库清理工具start&amp;使用clean&amp;的config.before(:each)方法config.after(:each)挂钩

config.before(:each) do
  DatabaseCleaner.start
end

config.after(:each) do
  DatabaseCleaner.clean
end

所以你要在每次测试之前开始DatabaseCleaner&amp;每次测试后都要清洁

答案 2 :(得分:2)

对我来说,问题是我遗传的规范中讨论的here已弃用的要求。我只需要从spec_helper.rb中删除以下行:

require 'rspec/autorun'

答案 3 :(得分:0)

解决方案就像愚蠢一样简单:

我在spec中声明了另一个Rakefile任务:

# http://blog.revathskumar.com/2011/12/run-rspec-as-rake-task.html
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec)
task default: :spec

不知道为什么我在那里加了它。删除后,它现在正在工作。

答案 4 :(得分:0)

我遇到了这个问题,因为RSpec有自己的rake任务在运行:default任务时自动运行规范,并且我已将以下代码添加到我的Rakefile(在Internet上找到):< / p>

require 'rspec/core/rake_task'
require 'cucumber/rake/task'

RSpec::Core::RakeTask.new
Cucumber::Rake::Task.new

task default: %i[spec cucumber]

实际上是第二次重新定义RSpec(和Cucumber)任务。我将其更改为以下内容:

task default: %i[spec cucumber]

现在只执行一次。

以下是完整的Rakefile

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

task default: %i[spec cucumber]

仅供参考:来自Rails 4.2,RSpec 3和Cucumber 3 app。

答案 5 :(得分:0)

双重测试在CI上运行

我得到了两次rspec运行,因为Rails spec任务与RSpec定义的任务发生冲突-但仅限于CI。对我来说,不同之处在于我在本地调用:

bundle exec rake

没有明确设置RAILS_ENV的地方。这很好,因为项目的spec_helper.rb设置了ENV["RAILS_ENV"] ||= 'test'

但是在CI上,ENV已经设置了RAILS_ENV=test,这也导致了Rails spec任务的定义,从而导致了两次测试。

总结:

bundle exec rake                  # => 1 test run
RAILS_ENV=test bundle exec rake   # => 2 test runs

修复

在加载task(:spec) 后清除Rails.application.load_tasks(如果您想自己定义:spec任务)。

diff --git a/Rakefile b/Rakefile
index 0f4fb7e0..94f7236a 100644
--- a/Rakefile
+++ b/Rakefile
@@ -6,14 +6,16 @@ require File.expand_path('../config/application', __FILE__)

 Rails.application.load_tasks

+task(:default).clear
+task(:spec).clear
+
 begin
   require "rspec/core/rake_task"
   RSpec::Core::RakeTask.new(:spec)
 rescue LoadError
 end

-task(:default).clear
 task default: [
   "factory_bot:lint",
   :spec,
 ]