когда заводская девушка создает объекты в БД? - PullRequest
26 голосов
/ 23 апреля 2010

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

1 Ответ

38 голосов
/ 23 апреля 2010

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

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

EDIT

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

Вы можете получить экземпляр 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
...