когда девочка фабрики создает объекты в дб?

Я пытаюсь моделировать использование сессии FactoryGirl/shoulda (это работало с приспособлениями, но у меня есть проблемы с использованием фабрик). У меня есть следующие фабрики (пользовательский вход в систему и электронная почта, которую оба имеют unique проверки):

Factory.define :user do |u| 
 u.login 'quentin'
 u.email 'quentin@example.com'
end

Factory.define :session_user, :class => Session do |ses| 
 ses.association :user, :factory => :user
 ses.session_id 'session_user'
end

и вот тест

class MessagesControllerTest < ActionController::TestCase

 context "normal user" do
  setup do 
   @request.session[:user_id]=Factory(:user).id
   @request.session[:session_id]=Factory(:session_user).session_id
  end

  should "be able to access new message creation" do
   get :new
   assert_response :success
  end
 end
end

но когда я работаю rake test:functionals, Я получаю этот результат испытаний

 1) Error: 
  test: normal user should be able to access new message creation. (MessagesControllerTest):
  ActiveRecord::RecordInvalid: Validation failed: Account name already exists!, Email already exists!

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

направляющие 2.3.5/shoulda/FactoryGirl

26
задан Martin Carney 18 February 2016 в 23:38
поделиться

1 ответ

Factory (: user) - это ярлык для Factory.create (: user) , поэтому в рамках вашей настройки вы создаете два объекта и сохраняете их в базе данных.

Factory.build (: user) создаст вам запись пользователя без сохранения ее в БД.

РЕДАКТИРОВАТЬ

На фабрике session_user вы создаете пользователя, а затем создаете другого в своей тестовой настройке. FactoryGirl создаст новую запись пользователя , потому что у вас есть связь в фабрике session_user .

Вы можете получить свой экземпляр пользователя из объекта session_user следующим образом: -

 context "normal user" do
  setup do
   session = Factory(:session_user)  
   @request.session[:session_id] = session.session_id
   @request.session[:user_id] = session.user_id
  end

, либо добавить некоторые сведения к фабрике user в убедитесь, что имя и адрес электронной почты уникальны: -

Factory.define :user do |u| 
 u.sequence(:login) {|n| "quentin#{n}" }
 u.sequence(:email) {|n| "quentin#{n}@example.com"}
end
38
ответ дан 28 November 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: