【问题标题】:when does factory girl create objects in db?工厂女孩什么时候在数据库中创建对象?
【发布时间】:2010-04-23 09:08:24
【问题描述】:

我正在尝试使用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

【问题讨论】:

    标签: ruby-on-rails shoulda factory-bot


    【解决方案1】:

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

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

    编辑

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

    您可以从session_user 对象中获取您的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
    

    【讨论】:

    • 但我的代码中只有一个 Factory(:user) 提及。为什么它运行两次? (第二个是Factory(:session_user),是一个Session实例)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多