Почему Factory Girl создает дубликаты, если вызывается в описательных блоках

Я использую Factory Girl и Faker для создания уникальных тестовых пользователей. Модель пользователя имеет проверку уникальности по электронной почте.

Если я вложу 2 уровня описательных блоков, то некоторые тесты не пройдут из-за дублирования писем. Если я не вставляю блоки описания, все вызовы фабрики возвращают уникальных пользователей и тесты проходят.

Почему Faker генерирует повторяющиеся электронные письма в первом сценарии?

#factories/user.rb

# a simple factory with Faker
FactoryGirl.define do
  factory :student, class: User do
    first_name { Faker::Name.first_name }
    last_name { Faker::Name.last_name }
    password { Faker::Lorem.words(3).join }
    email { Faker::Internet.email }
  end
end

#spec/models/user_spec.rb   

# in this test structure, Faker returns duplicate emails
describe "nested describe blocks" do
  describe "block 1" do
    it "creates faker duplicates" do 
      10.times{
        FactoryGirl.create(:student)
      }
    end
   end
  describe "block 2" do 
    it "creates faker duplicates" do 
      10.times{
        FactoryGirl.create(:student)
      }
    end
  end
end

# in this structure, Faker emails are unique
describe "no nested describe blocks" do     
  it "doesn't create duplicates" do 
    10.times{
      FactoryGirl.create(:student)
    }
  end      
  it "doesn't create duplicates" do
    10.times{
      FactoryGirl.create(:student)
    }
  end      
end

Rspec возвращает следующую ошибку:

Failure/Error: FactoryGirl.create(:student)
 ActiveRecord::RecordInvalid:
   Validation failed: Email has already been taken, Email has already been taken, Authentication token has already been taken

person dyanisse    schedule 27.06.2013    source источник
comment
Не могли бы вы опубликовать сообщение об ошибке?   -  person Peter Alfvin    schedule 28.06.2013
comment
Я взял ваши файлы и успешно запустил их на своей машине, но в процессе этого я столкнулся с проблемой запуска Rails в фоновом режиме с помощью spork, что не позволило мне уловить изменения в моем определении фабрик и привело к тому же Ошибки проверки, которые вы видели. Это долгий путь, но уверены ли вы, что Rails не работает в каком-то другом процессе, когда вы запускаете свои тесты? Кроме того, мне показалось странным, что вы получили несколько фраз об ошибках, разделенных запятыми. Ты знаешь почему? Наконец, я бы предложил изменить тест, чтобы печатать адрес электронной почты после каждого создания записи, чтобы найти дубли.   -  person Peter Alfvin    schedule 28.06.2013


Ответы (3)


Через несколько часов, ударившись головой об стол, мой коллега нашел ответ:

Почему factory_girl не работает в транзакционном режиме для меня? - строки остаются в базе после тестов

Фабрики оказались не транзакционными. Проблема исчезла после следующей строки в spec_helper.rb:

config.use_transactional_fixtures = true
person dyanisse    schedule 29.06.2013

@Dyanisse Как вы сказали, нам нужно выполнить следующую конфигурацию в spec_helper.rb

config.use_transactional_fixtures = true

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

auth_token { Faker::Lorem.characters(32) }

Не будет работать с:

auth_token Faker::Lorem.characters(32)
person Anuja    schedule 15.06.2015

В конце концов, Faker все равно будет генерировать повторяющиеся электронные письма. Вы можете использовать последовательности или проверить, что электронное письмо еще не существует. См. При использовании Faker производит повторяющиеся данные in factory_girl

person Dan Kohn    schedule 06.11.2015