Rails与验证和工厂女孩有许多联系

时间:2015-09-01 00:16:47

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

考虑使用模型UserListItem的rails项目。

list.rb

has_many :items
#check if the list has at least one item during save
validate :must_have_one_item_at_least

为此,我有一个这样的工厂:

factory :ordered_list_unpublished, traits: :ordered do
  transient do
    items_count 5
  end
  after(:build) do |list, evaluator|
    create_list(:item, evaluator.items_count, user: list.user, list: list)
  end
end

但由于create(:ordered_list_unpublished)

,当我执行Validation failed: Items count is zero. Atleast one item must be present.时,验证会失败

2 个答案:

答案 0 :(得分:0)

您正在调用create,它会在创建后尝试将项目保存到您的数据库中。 after :build回调将在创建完成后运行,因此它会在添加允许其通过验证的项目之前尝试保存到您的数据库中。

而不是create尝试

build(:ordered_list_unpublished)

并且您应该可以继续,因为这不会尝试保存模型。

可能需要考虑一下您是否真的需要验证项目数量是否大于1,因为可能存在您想先创建它并稍后添加项目的情况。

另一个考虑因素,当您验证时,您可以指定仅在第一次创建时进行验证,或者忽略第一次创建,然后仅在您更新时进行验证:

validates :email, uniqueness: true, on: :create
validates :email, uniqueness: true, on: :update

答案 1 :(得分:0)

对工厂的这一改变使其有效:

factory :ordered_list_unpublished, traits: [:ordered, :published] do
  transient do
    items_count 5
  end

  before(:create) do |list, evaluator|
    list.items << build_list(:item, evaluator.items_count, user: list.user, list: list)
  end
end

感谢answer