所以我在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
否则?
答案 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 })