Почему мои спецификации RSpec работают дважды? - PullRequest
17 голосов
/ 13 июня 2010

В моем 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 libs заставляло их бытьдважды определено, но удаление, которое, кажется, не имеет никакого эффекта.

Ответы [ 8 ]

19 голосов
/ 28 марта 2013

У меня была эта проблема при использовании zeus , и удаление require 'rails/autorun' из моего spec_helper.rb остановило его для меня

9 голосов
/ 12 октября 2014

При дублировании конфигураций в spec_helper.rb и .rspec мои тесты запускались дважды.

например

.rspec

--color

spec_helper.rb

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

Таким образом, создается впечатление, что тест дублируется, если у вас задан одинаковый параметр конфигурации SAME в .rspec и spec_helper.rb

5 голосов
/ 11 мая 2015

Оказывается, у 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 голосов
/ 07 декабря 2012

Это не имеет прямого отношения к вопросу, так как это, по-видимому, касается версий Rspec, начиная с 2, но поскольку название вопроса совпадает с тем, что привело меня сюда, я упоминаю других, которые могут найти эту страницу по той же причине что наличие rspec.rake в вашем lib/tasks может привести к тому, что rake spec выполнит все тесты спецификации дважды. Удаление этого файла помогло мне (как было предложено по адресу: http://www.patrickgannon.net/post/519eed022c17433fc8000018/rake-runs-rspec-tests-twice)

2 голосов
/ 12 мая 2016

Я наблюдал похожую вещь. Но в моем случае дело не в том, что тесты запускались дважды, они были напечатаны дважды.

Я выяснил, что причина этого в том, что я использую псевдоним rspec - rspec -f d -c (форматирование документации и цвета).

И spec_helper.rb содержит

config.color = true
config.formatter = :documentation

Так что, по сути, эта информация дублируется. После запуска unalias rspec я снова запускаю тесты, проблема устранена.

У вас также может быть файл .rspec, содержащий аналогичную информацию:

--format d
--color

Это также может привести к дублированию. Поэтому измените или переместите этот файл.

2 голосов
/ 13 июня 2010

Не знаю, решит ли это проблему, но вы можете использовать require 'spec_helper' вместо require File.dirname(__FILE__) + '/../spec_helper'

Также 'spec/autorun' будет require 'spec' для вас.

Единственное, о чем я могу думать, это то, что в вашей системе определены две специальные задачи. Это приложение для рельсов? Если это так, убедитесь, что вы не дублируете задачу rake, которая уже существует в lib/rake/tasks.

НТН, David

1 голос
/ 17 марта 2014

Другая причина, также в spec_helper.rb используется следующий код:

RSpec.configure do |config|
    #config stuff
end

Тесты были выполнены только один раз после удаления этого кода.

0 голосов
/ 16 января 2019

У нас сегодня была эта проблема в моей компании, и по другой причине здесь не было отмечено: мы автоматически загружали некоторые файлы, содержащие тестовую логику Затем они запускались, когда код требовался в первую очередь:

# 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 + не очень обычен и обычно указывает на плохую файловую структуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...