我使用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.rb
:
https://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.rb
。 Run all specs in spec directory (excluding plugin specs)
似乎来自rspec/rails/tasks/rspec.rake
。
在我看来,只有其中一个应该存在?!
更新2
rspec-rails
和test
组中的development
似乎存在问题。我在这里添加了一个问题:https://github.com/rspec/rspec-rails/issues/904
答案 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)
我得到了两次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,
]