为什么我的RSpec规格会运行两次?

时间:2010-06-12 22:21:15

标签: 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/spec_helper.rb中有以下内容:

require 'rubygems'
require 'spec'
require 'spec/autorun'
require 'rack/test'
require 'webmock/rspec'

include Rack::Test::Methods
include WebMock

require 'omniauth/core'

我在spec/foo/foo_spec.rb声明了一个规范:

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的{​​{1}}导致它们被双重定义,但删除它似乎没有任何效果。

8 个答案:

答案 0 :(得分:19)

我使用 zeus 时出现此问题,并从require 'rails/autorun'中移除spec_helper.rb为我停止了

答案 1 :(得分:9)

spec_helper.rb和.rspec中的重复配置导致我的测试运行两次。

e.g。

<强> .rspec

--color

<强> spec_helper.rb

Rspec.configure do |config|
  config.color = true
end

因此,如果在.rspec和spec_helper.rb中重复了SAME配置设置,它似乎会复制测试

答案 2 :(得分:5)

结果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

答案 3 :(得分:3)

这与问题没有直接关系,因为这显然涉及从2开始的Rspec版本,但由于问题的标题与我的相同,我提到其他可能因同样的原因找到此页面的人, rspec.rake中{{}}} lib/tasks会导致rake spec两次运行所有规范测试。删除该文件对我有帮助(如http://www.patrickgannon.net/post/519eed022c17433fc8000018/rake-runs-rspec-tests-twice

所示

答案 4 :(得分:2)

不知道这是否可以解决问题,但您可以使用require 'spec_helper'代替require File.dirname(__FILE__) + '/../spec_helper'

另外,'spec/autorun'将为您require 'spec'

我唯一能想到的是你在系统中定义了两个规范任务。这是一个rails应用程序吗?如果是,请确保您没有复制lib/rake/tasks中已存在的佣金任务。

HTH, 大卫

答案 5 :(得分:2)

我发现了类似的事情。但在我的情况下,并不是测试运行了两次,而是打印了两次。

我发现,原因是我将rspec别名为rspec -f d -c(格式化文档和颜色)。

spec_helper.rb包含

config.color = true
config.formatter = :documentation

所以基本上这些信息是重复的。运行unalias rspec后,我再次运行测试,问题得到解决。

您可能还有一个包含类似信息的.rspec文件:

--format d
--color

这也可能导致重复。所以修改或移动这个文件。

答案 6 :(得分:1)

其他原因,也在spec_helper.rb中使用以下代码:

RSpec.configure do |config|
    #config stuff
end

删除此代码后,测试仅执行一次。

答案 7 :(得分:0)

我们公司今天遇到了这个问题,这是由于这里没有提到的另一个原因:我们正在自动加载一些包含测试逻辑的文件。然后,当首先需要代码时就运行了这些代码:

hoverProperty()

解决方案是删除自动加载代码。 Rails +测试中的这类代码不是很常规,通常会指出文件结构不良。