如果我的工厂验证失败,我该如何引发错误?

How can I raise an error if my factory fails validation?

如果我使用 FactoryBot 创建记录,但验证失败,它只是 returns 一个未保存的实例。 有没有办法让 FactoryBot 抛出错误来帮助我及早调试问题?

FactoryBot.create(:house, some_options)
=> #<House id: nil, ...>

测试将继续并最终会在其他地方失败,因为我的对象无效。

我的第一个想法是创建一个特征并以某种方式将其默认设置为所有工厂,但我没有看到一种简单的方法来做到这一点。

trait :ensure_validity do
  before(:create) do |obj|
    raise StandardError unless obj.valid?
  end
end

尝试 "bang" 版本的方法。

house = FactoryBot.build(:house, options_hash)
house.save!

不幸的是,FactoryBot 没有 create! 方法,但 ActiveRecord 有。

在 Rails 中,您可以通过使用 :create! 方法而不仅仅是 :create 方法来导致 ActiveRecord 在记录无效时抛出错误。

你可以

House.create!(FactoryBot.attributes_for(:house, options_hash))

factory_bot 使用 save! 作为创建实例的默认值 (here is the configuration on Github),因此如果有任何验证错误,您应该立即得到一个错误。您是否有机会在您的工厂中使用自定义 to_create?你们能提供完整的工厂吗?

您可以在坚持之前使用 callbacks 进行验证吗?

after(:build) { |record| raise 'foo' unless record.valid? }