Подтвердить что ты не робот

Factory_girl + rspec, похоже, не откатывает изменения после каждого примера

Аналогично описанной здесь проблеме: http://rpheath.com/posts/411-how-to-use-factory-girl-with-rspec

в Short (сокращенный код):

spec_helper:

config.use_transactional_fixtures = true
config.use_instantiated_fixtures  = false

factories.rb:

Factory.define :state do
  f.name "NY"
end

в моей спецификации

before(:each) do 
  @static_model = Factory(:state) # with validate uniqueness of state name
end

Ошибка:

дублировать имя записи "NY" и т.д.


Вопрос: Не следует ли проверять базу данных rspec перед каждым конкретным примером и, следовательно, не бросать повторяющиеся ошибки ввода?

4b9b3361

Ответ 1

Вещи, которые я думаю:

  • Используете ли вы rake spec для запуска testuite: он создает базу данных с нуля (чтобы убедиться, что ничто не торчит).
  • Вы используете, где угодно, before (:all)? Поскольку все, что вы создаете внутри before :all, должно быть снова удалено в after :all или оно продолжает существовать.

Ответ 2

Несколько возможных причин:

  • Там все еще есть элемент state.yml, сидящий вокруг
  • Кто-то играл в тесте script/console и забыл очистить потом.

Ответ 4

Вопрос: не должна ли rspec очищать базу данных до каждого примера спецификации и, следовательно, не бросать ошибки повторного ввода?

RSpec с помощью DatabaseCleaner или RSpec Rails с использованием use_transactional_fixtures очистит DB, пока вы создали данные в самом примере. before :all do ... end рассматривается за пределами примера, поскольку данные остаются нетронутыми на нескольких примерах. Что бы вы ни создали в before :all, вам нужно удалить в after :all.

Чтобы удалить все, что вы создаете, автоматически используйте before :each do ... end. Имейте в виду, что одни и те же данные будут созданы и удалены 10 раз, если у вас есть 10 примеров. Разницу между before :all и before :each лучше объяснить здесь: rails rspec перед всеми vs перед каждым

Ответ 5

У меня были схожие вопросы о том, какое начальное состояние можно ожидать при использовании FG и RSpec.

Пока я слишком жду ясности, Database Cleaner может быть хорошим решением: http://rubydoc.info/gems/database_cleaner/0.6.7/frames hth - Перри

Ответ 6

Когда вы используете Factory (: state), который является ярлыком для Factory.create(: state), factory_girl возвращает сохраненный объект.

Вместо этого используйте Factory.build(: state).

Ответ 7

Чувак, может быть, ваши светильники yaml из регулярных модульных тестов смешиваются с вашим rspec?