Rails单元测试模型验证:包含失败

时间:2012-11-01 16:11:29

标签: ruby-on-rails ruby unit-testing inclusion

模型order.rb

class Order < ActiveRecord::Base
    attr_accessible :address, :email, :name, :payment_type_id
    belongs_to :payment_type

    PAYMENT_TYPES = PaymentType.pluck(:id)

    validates :name, :address, :email, :payment_type_id, :presence => true
    validates :payment_type_id, :inclusion => {:in => PAYMENT_TYPES}
end

模型payment_type.rb

class PaymentType < ActiveRecord::Base
  attr_accessible :name, :id

  has_many :order
end

从浏览器中,验证工作正常,如果错误则会出错,否则请继续。 但问题是当我从终端运行rake test:functionals时。测试没有通过验证。如果我评论这一行:

validates :payment_type_id, :inclusion => {:in => PAYMENT_TYPES}
一切都好。我不明白为什么它在一个地方工作,但在测试中没有? ......

灯具都可以。

请帮忙。

1 个答案:

答案 0 :(得分:1)

问题很可能是,您将付款类型存储在常量中。

为使您的测试正常运行,在rails加载PaymentTypes模型之前,必须在数据库中提供Order,而情况可能并非如此。

解决此问题的一种方法是使用(memoized)类方法来存储您的付款类型。只要您在数据库中的所有PaymentTypes之后访问此类方法,就应该没问题。

class Order < ActiveRecord::Base
  validates :payment_type_id, :inclusion => { :in => self.payment_types }

  def self.payment_types
    @@payment_types ||= PaymentType.pluck(:id)
  end
end