【问题标题】:rails-rspec uniqueness validation using accepts_nested_attributes_for使用 Accepts_nested_attributes_for 进行 rails-rspec 唯一性验证
【发布时间】:2012-12-13 13:27:45
【问题描述】:

我的模特关系像

class Cart < ActiveRecord::Base
  has_many :cart_items, :inverse_of => :cart, :dependent => :destroy
  accepts_nested_attributes_for :cart_items, :allow_destroy => :true, :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
  validates_associated :cart_items
  validates :cart_name, :presence => {:message => "Must be filled" }
end

class CartItem < ActiveRecord::Base
  belongs_to :cart, :inverse_of => :cart_items
  validates :cart_item_no, :presence => {:message => "Must be filled"}, :uniqueness => {:message => "Already exists" }
end

factories.rb

FactoryGirl.define do
  factory :cart do
    cart_name "sample"
    factory :cart_with_cart_items do
      after(:build) {|cart|
        2.times { cart.cart_items.build(attributes_for(:cart_item)) }
      }
      after(:create) {|cart|
        cart.cart_items.each {|cart_item| cart_item.save! }
      }
    end
  end

  factory :cart_item  do
    cart_item_no 1
    cart
  end
end

下面的测试用例总是失败

it "should not be valid with same cart_id" do
  cart = FactoryGirl.build(:cart_with_cart_items)
  cart.should_not be_valid
end

然后我在控制台中探索,通过以下代码示例,验证总是在 cart_items 中使用相同的 *cart_item_no* 两次返回 true。

cart = Cart.new(:cart_name => "yyy")
  => #<Cart id: nil, cart_name: "yyy">
2.times { cart.cart_items.build(:cart_item_no => 1000) }
  => 2
cart.cart_items 
  => [#<CartItem id: nil, cart_item_no: 1000>, #<CartItem id: nil, cart_item_no: 1000>]
cart.valid?
  => true
cart.save!
  => true  

这是轨道问题吗?

如何解决测试用例?

【问题讨论】:

    标签: ruby-on-rails-3 validation rspec unique


    【解决方案1】:

    仅针对数据库的唯一性验证检查。在您的情况下,您有两个 cart_items 相互冲突,但与数据库中的任何记录都不冲突,因此单独来说,两者都是有效的,这就是您的验证通过的原因。

    您可以在 Cart 类中添加自定义验证(未测试):

    validates :unique_cart_items
    
    def unique_cart_items
      unless cart_items.collect(&:cart_item_no).uniq.size < cart_items.size
        # set some error attribute here
      end
    end
    

    这会将唯一 cart_item_no 值的数量与 cart_items 的数量进行比较。如果不相同,则有重复的cart_item_no

    【讨论】:

    • 如果我在购物车模型中评论 accepts_nested_attributes_for,按预期工作,即只有一个 cart_items 记录保存在数据库表中,另一个对象返回错误。
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多