Question

Model 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

Model payment_type.rb

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

  has_many :order
end

From browser, validation works fine, if it is wrong it give an error, else go forward. But problem is when I run rake test:functionals from terminal. Test didn't pass the validation. If I comment this line:

validates :payment_type_id, :inclusion => {:in => PAYMENT_TYPES}

all is ok. I don't understand why it is working in one plase, but in tests not ? ...

Fixtures are all ok.

Please help.

Was it helpful?

Solution

Most likely the problem is, that you are storing your payment types in a constant.

For your tests to work, the PaymentTypes have to be available in the database before rails loads your Order model, and this might not be the case.

One way to get around this, would be to use a (memoized) class method to store your payment types. As long as you access this class method after all your PaymentTypes are in the database, you should be fine.

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

  def self.payment_types
    @@payment_types ||= PaymentType.pluck(:id)
  end
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top