Когда девушка factory создает объекты в db?
Я пытаюсь имитировать сеанс, используя FactoryGirl
/shoulda
(он работал с приборами, но у меня проблемы с использованием заводов). У меня есть следующие фабрики (логин пользователя и адрес электронной почты имеют unique
валидации):
Factory.define :user do |u|
u.login 'quentin'
u.email '[email protected]'
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!
что означает, что запись уже существует в db, когда я обращаюсь к ней в тестовой настройке. Что-то я здесь не понимаю? FactoryGirl
создавать все фабрики в db при запуске?
рельсы 2.3.5/shoulda/FactoryGirl
Ответы
Ответ 1
Factory(:user)
является ярлыком для Factory.create(:user)
, поэтому в вашей настройке вы создаете два объекта и сохраняете их в базе данных.
Factory.build(:user)
создаст вам запись user
без сохранения ее в БД.
ИЗМЕНИТЬ
В вашем session_user
factory вы создаете пользователя, а затем создаете другой в своей тестовой настройке. FactoryGirl
создаст новую запись user
, потому что у вас есть связь в session_user
factory.
Вы можете получить экземпляр 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, чтобы обеспечить уникальное имя и адреса электронной почты следующим образом: -
Factory.define :user do |u|
u.sequence(:login) {|n| "quentin#{n}" }
u.sequence(:email) {|n| "quentin#{n}@example.com"}
end