Ruby 为什么我的RSpec规范运行了两次?
我在我的Ruby 为什么我的RSpec规范运行了两次?,ruby,unit-testing,rspec,Ruby,Unit Testing,Rspec,我在我的Rakefile中定义了以下RSpec(1.3.0)任务: require 'spec/rake/spectask' Spec::Rake::SpecTask.new(:spec) do |spec| spec.libs << 'lib' << 'spec' spec.spec_files = FileList['spec/**/*_spec.rb'] end 我在spec/foo/foo_spec.rb中声明了一个规范: require 'rubyge
Rakefile
中定义了以下RSpec(1.3.0)任务:
require 'spec/rake/spectask'
Spec::Rake::SpecTask.new(:spec) do |spec|
spec.libs << 'lib' << 'spec'
spec.spec_files = FileList['spec/**/*_spec.rb']
end
我在spec/foo/foo_spec.rb
中声明了一个规范:
require 'rubygems'
require 'spec'
require 'spec/autorun'
require 'rack/test'
require 'webmock/rspec'
include Rack::Test::Methods
include WebMock
require 'omniauth/core'
require File.dirname(__FILE__) + '/../spec_helper'
describe Foo do
describe '#bar' do
it 'be bar-like' do
Foo.new.bar.should == 'bar'
end
end
end
当我运行rake spec时,单个示例运行两次。我可以通过让示例失败来检查它,给我两个红色的“F”
有一件事我认为,将
spec
添加到SpecTask
的libs
会导致它们被双重定义,但删除它们似乎没有任何效果。不知道这是否解决了问题,但您可以使用require'spec\u helper'
而不是require File.dirname(\uu File\uuuu)+'/../spec\u helper'
另外,'spec/autorun'
将为您要求'spec'
我能想到的另一件事是,在系统中定义了两个spec任务。这是rails应用程序吗?如果是这样,请确保您没有复制已存在于lib/rake/tasks
中的rake任务
嗯,,
David这与问题没有直接关系,因为这显然与第2版以后的Rspec版本有关,但由于问题的标题与我来到这里的标题相同,我向其他可能出于同样原因找到本页的人提及,在
lib/tasks
中使用rspec.rake
会导致rake spec
运行所有spec测试两次。删除该文件对我很有帮助(正如在:)我在使用宙斯时遇到了这个问题,并且从我的spec\u helper.rb
中删除需要“rails/autorun”
为我停止了它其他原因,也在spec\u helper.rb中使用了以下代码:
RSpec.configure do |config|
#config stuff
end
删除此代码后,测试只执行了一次。.rb和.rspec中的重复配置导致我的测试运行了两次 e、 g .rspec
--color
spec\u helper.rb
Rspec.configure do |config|
config.color = true
end
因此,当您在.rspec和spec_helper.rb中复制了相同的配置设置时,它似乎复制了测试。结果表明,Rails具有默认的
spec
任务,因此如果您使用Rails,问题的解决方案是清除预定义的任务,然后重新初始化自定义逻辑,如下所示:
# ... beginning of Rails Rakefile
Rails.application.load_tasks
Rake::Task["spec"].clear
RSpec::Core::RakeTask.new(:spec) do |t|
# your logic here
end
我观察到类似的事情。但就我而言,并不是测试运行了两次,而是打印了两次 我发现这样做的原因是,我将
rspec
别名为rspec-fd-c
(格式化文档和颜色)
而spec_helper.rb包含
config.color = true
config.formatter = :documentation
所以基本上这些信息是重复的。运行unalias rspec
后,我再次运行测试,问题得到了解决
您可能还有一个包含类似信息的.rspec文件:
--format d
--color
这也可能导致重复。因此,请修改或移动此文件。我们今天在我的公司遇到了这个问题,这是因为另一个原因,这里没有提到:我们正在自动加载一些包含测试逻辑的文件。当首先需要代码时,这些代码正在运行:
#需要支持、关注点、库、验证器和目录
%w(支持关注点lib)。每个do | dir|
Dir[Rails.root.join(“spec/{Dir}/***.rb”)]。每个{f}都需要f}
结束
解决方案是删除自动加载代码。Rails+测试中的这种代码不是很传统,通常指向糟糕的文件结构。它不是Rails应用程序,所以这不是问题所在。如果我的
$LOAD\u PATH
已设置,我只能执行要求“spec\u helper”
,但是如果我想运行单个spec,$LOAD\u PATH
将在spec\u helper.rb
内设置。我没有这一行,我仍然有这个问题。还有其他想法吗?我现在能给你的最好建议是升级到rails 4.1,并内置Spring,这将允许你完全停止使用宙斯。。删除它使我的测试只运行一次。我不知道为什么。看起来我需要使用~/.rspec
来代替。仅使用.rspec
文件就可以运行两次,我甚至不需要重复设置我在~/.rspec
和中的--color
格式d
和config.color=true
和config.formatter=:documentation
中的设置。为了不让rspec运行两次(无论我是否从代码或配置文件中删除),必须消除重复项。更多信息:“您添加了两个格式化程序,因此获得了双倍的输出”,我正在使用factory\u bot\u rails的rspec所有者说。我在spec/factories/factory\u bot\u spec.rb
下添加了一个绒线测试。它跑了两次。一旦我把它移动到spec/models/factory\u bot\u spec.rb
它只运行了一次。