FactoryGirl在使用包含必需属性的特征创建时未通过验证

时间:2016-04-14 03:45:11

标签: ruby-on-rails validation ruby-on-rails-4 activerecord factory-bot

我有一个包含两个角色的用户模型:memberadmin,默认为member。此模型有两个必需属性payout_bankpayout_account,只有在角色为member时才需要存在。

我的FactoryGirl for User有两个与角色相对应的特征。然后我将两个必需的属性添加到member特征,但是当我创建一个具有成员特征的用户并且启​​用了linting时,FactoryGirl会抱怨所需的属性未通过验证,因为它们是空白的。

如果我关闭了linting,它将正确生成一个成员用payout_bankpayout_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!'

2 个答案:

答案 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")角色,并且此角色需要memberpayout_bank,因此验证失败。

解决方案是将这两个属性移出payout_account特征并进入工厂的基础。

像这样的东西

member