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 перед каждым конкретным примером и, следовательно, не бросать повторяющиеся ошибки ввода?
Ответы
Ответ 1
Вещи, которые я думаю:
- Используете ли вы
rake spec
для запуска testuite: он создает базу данных с нуля (чтобы убедиться, что ничто не торчит).
- Вы используете, где угодно,
before (:all)
? Поскольку все, что вы создаете внутри before :all
, должно быть снова удалено в after :all
или оно продолжает существовать.
Ответ 2
Несколько возможных причин:
- Там все еще есть элемент state.yml, сидящий вокруг
- Кто-то играл в тесте script/console и забыл очистить потом.
Ответ 3
Вы также можете найти его, потому что вы не завернули оператор в:
describe "what it should do" do
@static_model = Factory(:state) # with validate uniqueness of state name
end
Я обнаружил, что это изменение решило эту проблему:
Почему для меня нет транзакции factory_girl? - строки остаются в базе данных после тестов
Ответ 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?