代码之家  ›  专栏  ›  技术社区  ›  Pavel K.

工厂女孩什么时候在数据库中创建对象?

  •  25
  • Pavel K.  · 技术社区  · 14 年前

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

    这意味着当我在测试设置中引用该记录时,该记录已经存在于数据库中。有什么我不明白的吗?做 女店员 启动时在数据库中创建所有工厂?

    钢轨2.3.5/应达/工厂女工

    1 回复  |  直到 9 年前
        1
  •  37
  •   theUtherSide adragom    9 年前

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

    Factory.build(:user) 将为您创建 user 记录但不保存到数据库。

    编辑

    在你之内 session_user 工厂您正在创建一个用户,然后在测试设置中创建另一个用户。 FactoryGirl 将创建新的 用户 因为你在 会话用户 工厂。

    你要么得到你的 用户 来自的实例 会话用户 目标如下:

     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
    

    或者你可以在 用户 工厂应确保以下名称和电子邮件地址的唯一性:

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