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

tktrz96b  于 2022-12-18  发布在  Ruby
关注(0)|答案(9)|浏览(135)

我在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添加到SpecTasklibs会导致它们双重定义,但删除它似乎没有任何效果。

zu0ti5jz

zu0ti5jz1#

我在使用zeus时遇到了这个问题,从我的spec_helper.rb中删除require 'rails/autorun'为我停止了这个问题

gkn4icbw

gkn4icbw2#

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

.报告规范

--color

规格_助手.rb

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

因此,当您在.rspec和spec_helper.rb中复制了相同的配置设置时,它似乎复制了测试

qybjjes1

qybjjes13#

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
6ioyuze2

6ioyuze24#

这与问题没有直接关系,因为这显然涉及到Rspec 2以上的版本,但由于问题的标题与我来到这里的标题相同,我向其他可能出于同样原因找到此页面的人提到,在您的lib/tasks中包含rspec.rake可能会导致rake spec运行所有规范测试两次。http://www.patrickgannon.net/post/519eed022c17433fc8000018/rake-runs-rspec-tests-twice

pxiryf3j

pxiryf3j5#

我观察到了类似的情况,但在我的例子中,测试并不是运行了两次,而是打印了两次。
我发现,这是因为我将rspec作为rspec -f d -c的别名(格式化文档和颜色)。
并且spec_helper.rb包含

config.color = true
config.formatter = :documentation

所以本质上这些信息是重复的。在我运行unalias rspec之后,我再次运行我的测试,问题就解决了。
您可能还有一个包含类似信息的.rspec文件:

--format d
--color

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

wfauudbj

wfauudbj6#

不知道这是否解决了问题,但您可以使用require 'spec_helper'而不是require File.dirname(__FILE__) + '/../spec_helper'
同样,'spec/autorun'将为您提供require 'spec'
我唯一能想到的是,你的系统中定义了两个spec任务,这是一个rails应用程序吗?如果是的话,确保你没有复制lib/rake/tasks中已经存在的rake任务。
戴维·特赫

c3frrgcw

c3frrgcw7#

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

# Require support, concerns, lib, validators dirs
%w(support concerns lib).each do |dir|
  Dir[Rails.root.join("spec/#{dir}/**/*.rb")].each { |f| require f }
end

解决方案是删除自动加载代码,Rails + tests中的这类代码不是很常规,通常指向糟糕的文件结构。

lrpiutwd

lrpiutwd8#

另一个原因,也在spec_helper.rb中使用以下代码:

RSpec.configure do |config|
    #config stuff
end

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

yvgpqqbh

yvgpqqbh9#

我的主目录中有一个.rspec文件,而我的项目.rspec也在当前目录中。
从主目录中删除额外的.rspec文件为我修复了它。

相关问题