我有一个包含两个角色的用户模型:member
和admin
,默认为member
。此模型有两个必需属性payout_bank
和payout_account
,只有在角色为member
时才需要存在。
我的FactoryGirl for User有两个与角色相对应的特征。然后我将两个必需的属性添加到member
特征,但是当我创建一个具有成员特征的用户并且启用了linting时,FactoryGirl会抱怨所需的属性未通过验证,因为它们是空白的。
如果我关闭了linting,它将正确生成一个成员用payout_bank
和payout_account
填写。发生了什么事?
模型User.rb
class User < ActiveRecord::Base
validates_presence_of :payout_bank, :payout_account, if: :member?
def set_default_role
self.role ||= :member
end
end
Factory User.rb
FactoryGirl.define do
factory :user do
sequence(:email) { |n| "user#{n}@email.com" }
password "password"
trait :member do
sequence(:email) { |n| "member#{n}@email.com" }
role "member"
payout_bank { Faker::Company.name }
payout_account { Faker::Number.number(10) }
end
trait :admin do
sequence(:email) { |n| "admin#{n}@email.com" }
role "admin"
status "active"
end
end
end
从工厂创建用户
FactoryGirl.lint
FactoryGirl.create(:member_user, :member)
输出
FactoryGirl::InvalidFactoryError: The following factories are invalid:
* member_user - Validation Failed: payout_bank cannot be blank, payout_account cannot be blank (ActiveRecord::RecordInvalid)/usr/local/lib/ruby/gems/2.3.0/gems/factory_girl-4.7.0/lib/factory_girl/linter.rb:12:in `lint!'
答案 0 :(得分:0)
您必须在 spec / models directrory中编写验证测试。像。的东西。
需要'rails_helper' 要求“validates_email_format_of / rspec_matcher”
RSpec.describe BankAccount, type: :model do
it "should have a account number" do
bank_a = build(:bank_account, account_no: '')
expect(bank_a).to_not be_valid
end
end
答案 1 :(得分:0)
我发现FactoryGirl.lint是引发验证失败的线路。这里的问题是linting将尝试创建没有特征的通用User模型。由于我的用户模型默认为column("label")
角色,并且此角色需要member
和payout_bank
,因此验证失败。
解决方案是将这两个属性移出payout_account
特征并进入工厂的基础。
像这样的东西
member