FactoryGirl禁用一些工厂的linting

时间:2016-06-26 19:56:28

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

所以我在rails_helper中有这段代码

config.before(:suite) do
    begin
      FactoryGirl.lint
  end

这让我很头疼。我有一个User类,可以有几个附加的配置文件,如下所示:

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

现在问题是,在用户注册期间,我需要根据注册用户的类型发送不同的电子邮件布局(我正在对他们的个人资料进行分类,并且取决于"更强大的"个人资料,我切换到合适的布局。

我已经覆盖了设计邮件程序,以添加基于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 - 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否则?

2 个答案:

答案 0 :(得分:1)

如果您的工厂不需要坚持,您可以customize your factory's way to persist the object

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

    # ...

这将允许lint步骤成功,但需要注意的是,当您执行save!时,它不再调用FactoryGirl.create(:foo)

答案 1 :(得分:1)

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

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