factory_girl + rspec не откатывает изменения после каждого примера - PullRequest
18 голосов
/ 26 июля 2010

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

Коротко (сокращенный код):

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 очищать базу данных перед каждым примером спецификации и, следовательно, не выбрасывать повторяющиеся ошибки ввода?

Ответы [ 7 ]

40 голосов
/ 26 июля 2010

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

  • используете ли вы rake spec для запуска своего тестового набора: который создает базу данных с нуля (чтобы убедиться, что ничего не зависает)
  • Вы используете где-нибудь before (:all)? Потому что все, что вы создаете внутри before :all, должно быть снова удалено в after :all, или оно продолжает существовать.
3 голосов
/ 23 июня 2014

Вопрос: не следует ли 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 перед всеми против каждого перед

2 голосов
/ 17 августа 2010

Вы также можете найти это потому, что вы не обернули оператор в:

describe "what it should do" do
  @static_model = Factory(:state) # with validate uniqueness of state name
end

Я обнаружил, что именно это изменение решило эту проблему: Почему factory_girl не работает для меня транзакционно?- строки остаются в базе данных после тестов

2 голосов
/ 01 августа 2010

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

  • Все еще есть штат States.yml, сидящий вокруг
  • Кто-то играл на скрипте / тесте консоли и потом забыл убрать.
1 голос
/ 29 апреля 2011

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

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

0 голосов
/ 27 октября 2011

Чувак, может быть, твои устройства yaml от обычных юнит-тестов смешались с твоим rspec?

0 голосов
/ 03 октября 2011

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

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

...