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

时间:2010-04-23 09:08:24

标签: 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

这是测试

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中创建所有工厂?

rails 2.3.5 / shoulda / FactoryGirl

1 个答案:

答案 0 :(得分:38)

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

Factory.build(:user)会为您创建一个user记录,而不会将其保存到数据库中。

修改

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