Почему Фабричная девушка создает дубликаты, если вызывается в блоках описания


Я использую 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
3 3

3 ответа:

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

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

Заводы оказались не транзакционными. Проблема исчезла после следующей строки в spec_helper.РБ:
config.use_transactional_fixtures = true

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

config.use_transactional_fixtures = true

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

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

Он не будет работать с:

auth_token Faker::Lorem.characters(32)

Фейкер все равно будет генерировать дубликаты писем в конечном итоге. Вы можете либо использовать последовательности, либо проверить, что электронная почта еще не существует. Смотрите Факер создает дубликаты данных при использовании в factory_girl