Ruby on rails Rails与验证和工厂管理有很多联系
考虑一个包含用户模型、列表模型和项目模型的rails项目 list.rb 为此,我有一个这样的工厂:Ruby on rails Rails与验证和工厂管理有很多联系,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,考虑一个包含用户模型、列表模型和项目模型的rails项目 list.rb 为此,我有一个这样的工厂: 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:
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
但是当我创建:ordered_list_未发布时,验证一直失败,因为验证失败:Items count为零。必须至少存在一个项目。您正在调用create,它将尝试在项目创建后将其保存到您的数据库中。after:build回调将在创建完成后运行,因此它试图在添加允许其通过验证的项之前保存到数据库中
与其创建,不如尝试
您应该能够继续,因为这不会试图保存模型
可能需要考虑是否确实需要验证项目数是否大于1,因为在某些情况下,可能需要先创建项目,然后再添加项目
另一个注意事项是,验证时,可以指定仅在第一次创建时进行验证,或忽略第一次创建,然后仅在更新时进行验证:
validates :email, uniqueness: true, on: :create
validates :email, uniqueness: true, on: :update
工厂的这一变化使其得以运作:
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
多亏了这个
validates :email, uniqueness: true, on: :create
validates :email, uniqueness: true, on: :update
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