工厂女孩什么时候在db中创建对象?

Pav*_* K. 26 ruby-on-rails shoulda factory-bot

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

这是测试

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
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时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!
Run Code Online (Sandbox Code Playgroud)

这意味着当我在测试设置中引用它时,记录已存在于db中.我有什么不明白的地方吗?FactoryGirl在启动时是否在db 中创建所有工厂?

rails 2.3.5/shoulda/FactoryGirl

Ste*_*eet 38

Factory(:user)是一个快捷方式,Factory.create(:user)因此在您的设置中,您创建两个对象并将它们保存到数据库.

Factory.build(:user)将创建一个user记录而不将其保存到数据库.

编辑

在您的session_user工厂内,您将创建一个用户,然后在您的测试设置中创建另一个用户.FactoryGirl将创建一个新user记录,因为您在session_user工厂中有关联.

您可以按如下方式usersession_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
Run Code Online (Sandbox Code Playgroud)

或者您可以向user工厂添加一些细节,以确保唯一的名称和电子邮件地址,如下所示: -

Factory.define :user do |u| 
 u.sequence(:login) {|n| "quentin#{n}" }
 u.sequence(:email) {|n| "quentin#{n}@example.com"}
end
Run Code Online (Sandbox Code Playgroud)