【发布时间】:2012-12-29 04:00:22
【问题描述】:
我有模型类别,它拥有并属于许多包。当用户在一个类别中创建一个帖子时,它必须属于该类别中的一个包。
这是自定义验证器的代码:
class PackageValidator < ActiveModel::Validator
def validate(record)
record.errors[:package_id] <<
I18n.t('errors.messages.package.not_in_category') unless
record.category.packages.include? record.package
end
end
这很好用,但它破坏了我所有的 rspec 测试(使用 factory_girl),因为 factory_girl 为每个类别创建一个新包,并用它构建/创建发布。
这是我的工厂:
factory :category do
sequence(:name) {|n| "Parts#{n}"}
sequence(:slug) {|n| "parts#{n}"}
packages {[FactoryGirl.create(:package)]}
end
factory :posting do
title 'Foo'
body 'Bar'
category
package
end
factory :package do
sequence(:name) {|n| "Basic#{n}"
price 0
photos 5
end
我怎样才能让它们完美地融合在一起?
【问题讨论】:
-
你能在邮寄工厂里做点什么吗,比如设置包到
category.packages.first,可能在after(:build)钩子里? -
谢谢,成功了。我的验证器仍然破坏了应该匹配器,但那是因为它假设 Posting 是使用类别构建的。在
PackageValidator#validate方法的开头添加return if record.category.nil?修复了该问题。我已经有一个验证可以确保类别的存在,所以应该可以正常工作。 -
您能否将您的评论转换为答案,以便我接受它作为答案?
标签: ruby-on-rails validation testing factory-bot rspec-rails