FactoryGirl 禁用某些工厂的 linting

FactoryGirl disable linting for some factories

所以我的 rails_helper

中有这段代码
config.before(:suite) do
    begin
      FactoryGirl.lint
  end

这让我很头疼。我有一个用户 class,它可以有多个附加配置文件,如下所示:

class User
  has_one :student_profile, class_name: Student
  has_one :employee_profile, class_name: Employee
end

现在的问题是,在用户注册期间,我需要根据正在注册的用户类型发送不同的电子邮件布局(我正在 class 验证他们的个人资料,并取决于 "stronger" 配置文件,我切换到适当的布局。

我已经覆盖了设计邮件程序以添加基于 main_profile 类型的布局

def layout_for_user(user)
    case user.main_profile // user.employee_profile || user.student_profile || user
    when Employee
      'layouts/mailer/company'
    when Student
      'layouts/mailer/student'
    else
      fail ArgumentError, 'Unknown layout for profile'
    end
end

在我的注册过程中,我确保在保存 user/sending 确认之前至少建立了一种配置文件类型。

但似乎工厂女孩试图建立和拯救每一种类型的工厂,所以我得到了很多 user - Unknown layout for profile (ArgumentError)

有没有办法告诉 FactoryGirl.lint 跳过一些工厂?例如,没有任何配置文件的用户是没有意义的,但仍然会生成错误

# rspec/factories/user.eb
FactoryGirl.define do
  factory :user do
    ...

  trait(:student) do

    after(:build) do |user, evaluator|
      user.student_profile = build(:student_profile,
        user: user)
      end
    end

  factory :student_user, traits: [:student]
end

这里我的 user 工厂是某种抽象工厂,永远不应该单独实例化(否则会导致上述错误)有什么办法可以解决这个问题?我正在考虑评论这一行 FactoryGirl.lint 否则 ?

如果你的工厂不需要持久化,你可以customize your factory's way to persist the object:

FactoryGirl.define do
  factory :foo do
    to_create { true } # no-op

    # ...

这将允许 lint 步骤成功,但需要注意的是当您执行 FactoryGirl.create(:foo).

时它不再调用 save!

您不必 运行 lint 使用默认参数。要为某些禁用 linting - 可以预先过滤工厂:

FactoryGirl.lint(FactoryGirl.factories.reject{|f| f.name == :some_abstract_factory })