Тест rspec проходит изолированно, но не проходит при запуске с другими тестами - PullRequest
14 голосов
/ 04 декабря 2011

У меня есть некоторые спецификации, написанные на RSpec, которые тестируют различные модели.Я использую Factory Girl для генерации объекта для тестирования.

Теперь происходит самое странное:
Когда я запускаю rspec spec/models/specific_model_spec.rb --- это проходит все тесты в этой спецификации

Однако, когда я запускаю rspec spec/models --- каждый тест в этой спецификации терпит неудачу, ссылаясь на создаваемую недопустимую ассоциацию (через фабрику)

Ассоциация, созданная фабрикой, очевидно, действительна, поскольку тест выполняется отдельно.показывает.

Что может быть причиной этого поведения?

Обновление:
Ошибка, которую я получаю при запуске спецификации вместе с другими спецификациями (ошибка та жедля каждого сбоя):

6) StreamItem adds a stream_item to a project and consultant when an engagement is added 
 Failure/Error: @project = Factory.create(:project, :name => 'bar' )
 Validation failed: Customer is invalid
 # ./spec/models/stream_item_spec.rb:44:in `block (2 levels) in <top (required)>'

project factory протестирован в другой спецификации и проходит нормально ...

Обновление 2: Используется соответствующий заводской код:следующие:

Factory.define :manager, :class => User do |f|
  f.sequence(:email) { |n| "bar#{n}@example.com" }
  f.password "pass12"
  f.sequence(:name) { |n| "Erwin#{n}" }
  f.roles_mask 4
end

Factory.define :customer do |f|
  f.sequence(:name) { |n| "foo customer#{n}" }
  f.association :last_actor, :factory => :manager
  f.account_id 1
end

Factory.define :project do |f|
  f.sequence(:name) { |n| "foo project#{n}" }
  f.association :manager, :factory => :manager
  f.association :customer, :factory => :customer
  f.start_date Date.today << 1
  f.finish_date Date.today >> 2
  f.status 1
  f.association :last_actor, :factory => :manager
  f.account_id 1
end

Ответы [ 2 ]

17 голосов
/ 28 сентября 2017

RSpec теперь имеет функцию "bisect" , специально разработанную для поиска такого рода проблем.

Запустите команду RSpec, которая вызывает сбой, с флагом --bisect, и RSpec будетавтоматически определять, какая комбинация спецификаций вызывает этот сбой.

rspec spec/models --bisect
13 голосов
/ 11 декабря 2011

Это обычно означает, что ваши другие спецификации оставляют некоторые данные в БД, которые конфликтуют с более поздними вызовами фабрики.Я подозреваю, что если вы посмотрите, почему не удалось создать метод фабричного создания, вы увидите проверку на отсутствие уникальности, возможно, по электронной почте клиента.

Отключите фиксации транзакций:

# spec_helper.rb
config.use_transactional_fixtures = false

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

...