Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么我的RSpec规范运行了两次?_Ruby_Unit Testing_Rspec - Fatal编程技术网

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
它只运行了一次。