【问题标题】:Test validation that makes sure record is associated to records only owned by parent with spec确保记录与仅由具有规范的父级拥有的记录相关联的测试验证
【发布时间】: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


【解决方案1】:

您可以在after(:build) 挂钩中将包设置为category.packages.first

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多