正在获取FactoryBot :: DuplicateDefinitionError:工厂已注册

时间:2018-09-06 10:36:46

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

运行用户规范时,我收到FactoryBot :: DuplicateDefinitionError:Factory已注册:用户错误。我想创建具有不同名称和年龄的用户的多个对象。我在工厂目录中的user.rb是

FactoryBot.define do
   @users = [{display_name: 'abc', age: 25}, {display_name: 'xyz', age: 30}]

  @users.each do |user|
    factory :user do
      display_name user[:display_name]
      age user[:age]
    end
  end
end

此代码有什么问题吗? 谢谢

4 个答案:

答案 0 :(得分:0)

我认为这是使用FactoryBot特征的一个很好的例子。

永远只能有一个命名工厂,但是特征允许对该命名工厂的变化。

考虑这样的事情:

FactoryBot.define do
  factory :user do
    trait :bob do
      display_name { 'Bob' }
      age { 30 }
    end

    trait :jimmy do
      display_name { 'Jimmy' }
      age { 26 }
    end
  end
end

然后,当您需要Jimmy时,可以像这样致电用户工厂:

FactoryBot.create :user, :jimmy

或者如果您需要鲍勃,可以这样称呼它:

FactoryBot.create :user, :bob

希望这会有所帮助。

答案 1 :(得分:0)

您应该根据运行的规范调用工厂(具有不同的属性)。

工厂:

FactoryBot.define do
  factory :user do
    display_name { "bob" }
    age { 30 }
  end
end

在规范中:

let(:bob) { create(:user) }
let(:jimmy) { create(:user, display_name: "jimmy", age: 25) }

或者,如果您真的要遍历原始数组,则:

@users = [{display_name: 'abc', age: 25}, {display_name: 'xyz', age: 30}]
@users.each do |user|
  create(:user, display_name: user[:display_name], age: user[:age])

end

答案 2 :(得分:0)

您需要验证/test/factories目录,也许rails generator为用户创建了工厂

答案 3 :(得分:-1)

我收到此错误,并通过将./spec/factories目录中的所有文件收集到一个文件./spec/support/factory_models.rb中并在require 'support/factory_models'中添加rails_helper.rb进行了修复

但是,每当生成新模型时,都必须通过挂起将新模型的工厂代码剪切/粘贴到factory_models.rb中。