【问题标题】:FactoryGirl, 2 times creates user?FactoryGirl,2次创建用户?
【发布时间】:2012-12-07 07:39:32
【问题描述】:

我真的不明白建立关联。在 spec_helper 我有

def log_in_user
  user = User.find_by_name 'User1'
  user = FactoryGirl.create :user1 unless user
  sign_in user
end

在 rspec 中

let(:product) { FactoryGirl.build :product_A }


describe "GET confirm purchase" do
    it "xxx" do
      log_in_user

      Product.should_receive(:find_active_by_id).with("1").and_return(product)

       ...
   end
end

工厂.rb

FactoryGirl.define do
    factory :user do
        encrypted_password 'abcdef1'
        confirmed_at Time.now

            factory :user1 do
              email 'user1@test.com'
              name 'User1'
              year 1984
            end
    end

    factory :product do
        factory :product_A do
          name "product A"
          association :user, factory: :user1
        end
    end
end

当我运行测试用例时发生异常: ActiveRecord::RecordInvalid:验证失败:电子邮件已被使用

看起来 user1 正在创建 2 次,一次在 log_in_user 中,第二次在 factory: association :user, factory: :user1 中

我是对的吗?如果是,我该如何解决这个问题?我想创建用户并在工厂产品中定义关联

最好的

【问题讨论】:

    标签: ruby-on-rails-3 rspec factory-bot


    【解决方案1】:

    当您使用:product_A 时,它会自动调用:user1 的工厂。

    然后您将 :user1 再次工厂化到 log_in_user,但对唯一电子邮件的验证会阻止创建第二个 :user1

    我建议您将电子邮件发送为 sequence,如下所示:

    FactoryGirl.define do
      sequence :email do |n|
        "user#{n}@test.com"
      end
    
      factory :user do
        encrypted_password 'abcdef1'
        confirmed_at Time.now
    
        factory :user1 do
          email
          name 'User1'
          year 1984
        end
      end
    
      factory :product do
        factory :product_A do
          name "product A"
          association :user, factory: :user1
        end
      end
    
    end
    

    然后,我将更改 sign_in_user 以将(可选)用户作为这样的选项:

    def log_in_user(user)
      user =|| User.find_by_name 'User1'
      user =|| FactoryGirl.create :user1
      sign_in user
    end
    

    并修改您的测试用例以将该用户对象传递给登录:

    let(:product) { FactoryGirl.build :product_A }
    
    describe "GET confirm purchase" do
      it "xxx" do
        log_in_user(product.user)
        Product.should_receive(:find_active_by_id).with("1").and_return(product)
     end
    end
    

    【讨论】:

    • 这不会仍然创建两个用户,我认为这是他最初的问题吗?
    • @RyanBigg 我读到的问题是他不明白为什么它试图创建两个用户。我扩展了我可能会如何进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多