Я пытаюсь моделировать использование сессии 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
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