последовательность и уникальность factory_girls - PullRequest
2 голосов
/ 13 мая 2011

У меня есть эта настройка на фабриках.rb.

Factory.sequence(:email) { |n| "email#{n}@factory.com" }
Factory.sequence(:username) { |n| "username_#{n}" }

Factory.define :user do |u|
  u.email { Factory.next :email }
  u.username { Factory.next :username }
  u.first_name 'Ivan'
  u.last_name 'Pupkin'
  u.latitude '42'
  u.longitude '-71'
  u.password 'qwerty'
  u.password_confirmation 'qwerty'
end

Когда я создавал два экземпляра Фабрики (: users), я получал ошибку уникальности.

describe CartsController do

  let(:user) { Factory(:user) }
  let(:another_user) { Factory(:user) }
  let(:cart) { Factory(:cart) }


  describe 'show my cart' do
    before { sign_in user}
    before { get :show, :id => user.carts.last }
    it { should respond_with :success }
  end

  describe 'show different person cart' do
    before { sign_in user }
    before { get :show, :id => another_user.carts.last}
    it { should respond_with :redirect }
  end
end

Где моя проблема?

Failure/Error: let(:user) { Factory(:user) }
Validation failed: Username has already been taken, Email has already been taken

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Кажется, что в вашей БД есть записи, потому что происходит сбой let(:user) { Factory(:user) }, а не let(:another_user) { Factory(:user) }, поэтому я вижу два возможных решения: добавьте User.delete_all в верхнюю или очистите вручную БД

1 голос
/ 13 мая 2011

Да, это остатки в тестовой БД.У вас должна быть следующая строка в spec_helper.rb:

  config.use_transactional_fixtures = true

Обратите внимание, что это полезно, даже если вы используете фабрики, а не приборы.Он оборачивает каждый пример в транзакцию базы данных, так что каждый раз у вас есть чистый лист.Если вы не используете ActiveRecord или транзакции не будут работать для вас по какой-либо другой причине, вам нужно добавить что-то вроде database_cleaner gem для очистки базы данных теста после каждого запуска теста.

...