Почему мои спецификации RSpec работают в два раза?

У меня есть следующая задача RSpec (1.3.0), определенная в моем Rakefile:

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" s.

Я подумал, что добавление spec в SpecTask libs приводит к тому, что они должны быть двузначными, но удаление, похоже, не имеет никакого эффекта.

Ответы

Ответ 1

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

Ответ 2

Конфигурации дублирования в spec_helper.rb и .rspec приводили к тому, что мои тесты выполнялись дважды.

например.

.rspec

--color

spec_helper.rb

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

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

Ответ 3

Выключает 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

Ответ 4

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

Ответ 5

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

Кроме того, 'spec/autorun' будет require 'spec' для вас.

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

НТН, Дэвид

Ответ 6

Я наблюдал подобное. Но в моем случае это не то, что тесты выполнялись дважды, они дважды печатались.

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

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

config.color = true
config.formatter = :documentation

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

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

--format d
--color

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

Ответ 7

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

RSpec.configure do |config|
    #config stuff
end

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

Ответ 8

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

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