Последовательность Factory Girl не срабатывает при автоспецификации - PullRequest
4 голосов
/ 10 июня 2010

У меня есть эта фабрика:

Factory.define :email_address do |e|
  e.sequence(:address) { |n| "factory_#{n}@example.com" }
  e.validated true
end

Когда я запускаю свои спецификации с rake spec, он работает нормально.

Когда я запускаю autospec, он сразу не работает, утверждая, чтоадрес электронной почты используется дважды в двух разных объектах (существует проверка, которая ограничивает это).

Почему в autospec он ведет себя по-разному?

Ответы [ 2 ]

3 голосов
/ 02 июля 2011

Иногда, когда вы прерываете набор тестов с помощью Ctrl + C, это может привести к загрязнению вашей базы данных.Поскольку ваша база данных грязная, создание новых объектов будет иметь конфликты проверки.Просто запустите rake db:test:clone снова и все будет в порядке.

1 голос
/ 18 июня 2010

Я подозреваю, что происходит то, что FactoryGirl сбрасывает значение n при каждом вызове с autospec, но база данных не очищается.

Сначала, чтобы проверить этот диагноз, измените свою фабрикук следующему:

Factory.define :email_address do |e|
  e.sequence(:address) { |n| puts "Email ##{n}"; "factory_#{n}@example.com" }
  e.validated true
end

Если мой диагноз правильный, есть два возможных исправления:

  1. изменить FactoryGirl, чтобы начать с индекса, превышающего максимальный используемый ID.Это может привести к серьезному взлому Factory::Sequence - вам, вероятно, придется повернуть Factory::Sequence.sequences с Hash[Symbol => Proc] на Hash[Symbol => [Proc, Integer], который помнит самый высокий индекс, который он использовал.Действительно, это может даже не сработать, поскольку autospec действительно , похоже, правильно выгружает классы FactoryGirl (в противном случае поиск последовательности не приведет к сбою и созданию нового объекта Factory::Sequence).
  2. выяснить, почему ваша база данных не очищается между каждым запуском autospec.Вы проверили свои методы демонтажа?Поддерживает ли ваша тестовая база данных транзакции?
...