Как проверить метод before_save, в том числе с помощью rspec - PullRequest
2 голосов
/ 08 августа 2010

У меня проблема с тестированием следующей модели:

class Bill < ActiveRecord::Base
  belongs_to :consignee
  before_save :calc_rate

  def calc_rate
    self.chargeableweight = self.consignee.destination.rate * self.weight
  end
end

Модель получателя:

class Consignee < ActiveRecord::Base
  belongs_to :destination
  has_many :bills
end

Контроллеры еще не затронуты.

поведение приложения правильное (ответьте на вопрос: есть ли проблемы с производительностью в этом решении?) - но тестовый перерыв.

У вас есть нулевой объект, когда вы его не ожидали!Возможно, вы ожидали экземпляр Array.Произошла ошибка при оценке nil. *

Спасибо за совет, Дэнни

обновление:

Этот тест на счет-паузу с использованием фабричной девушки:

describe Bill do

  it "should call the calc_rate method" do
    bill = Factory.build(:bill)
    bill.save!
    bill.should_receive(:calc_rate)
  end
end

У вас есть нулевой объект, когда вы его не ожидали!

Фабрики:

Factory.define :destination do |f|
  f.airport_code "JFK"
end

Factory.define :consignee do |f|
  ...
  f.association :destination
end


Factory.define :bill do |f|
  f.association :consignee
  f.weight 10
  f.chargeableweight 20.0
  f.after_create do |bill|
    bill.calc_rate
end

1 Ответ

1 голос
/ 08 августа 2010
describe Consignee do
  it "should calculate the rate" do
    #pending
    #make sure this spec is passing first, so you know your calc_rate method is fine.
  end

  it "should accept calc_rate before save" do
    cosignee = mock("Consignee")
    consignee.should_receive(:calc_rate).and_return(2) # => stubbing your value
  end
end

Я не подпортил приложение rails, чтобы протестировать этот код, но это должно вас приблизить. Кроме того, предполагая, что столбцы chargeable_rate, weight и т. д. являются столбцами в модели, вам не нужно вызывать self. Ruby неявно ожидает себя, если нет доступного метода экземпляра или переменной с таким именем, и автоматически ищет методы класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...