Тестирование запоминания - PullRequest
       13

Тестирование запоминания

7 голосов
/ 10 сентября 2011

У меня есть дорогой метод, который называется calculate_total.Мне нужен метод с именем total, который вернет результат calculate_total.Последующие вызовы total должны возвращать предыдущий результат calculate_total.

. Я хочу сделать это в тестовом режиме.Вот мои тесты (я использую RSpec):

describe Item do
  describe "total" do
    before do
      @item = Item.new
      @item.stub!(:calculate_total => 123)
    end

    it "returns the calculated total" do
      @item.total.should == 123
    end

    it "subsequent calls return the original result" do
      previous_total = @item.total
      @item.total.should equal(previous_total)
    end
  end
end

Это не очень хороший тест, потому что следующий метод делает тесты успешными, но я ожидал, что второй тест провалится:

def total
  calculate_total
end

Причина в том, что calculate_total возвращает Fixnum, поэтому ruby ​​не видит результат как 2 разных объекта.Я ожидал, что второй тест провалится, поэтому я мог бы сделать следующее, чтобы он прошел:

def total
  @total ||= calculate_total
end

Кто-нибудь знает лучший способ проверить это?

Не думаю, чтоэто лучший / правильный способ проверить это, но я остановился на этом: https://gist.github.com/1207270

Ответы [ 2 ]

7 голосов
/ 10 сентября 2011

Я думаю, что ваша суть в порядке: вы хотите проверить, вызывается ли метод calc_total более одного раза, и это именно то, что вы делаете.Единственное отличие, которое я могу предложить, это немного более явный тест:

it "subsequent calls don't calculate the total, but still return the original result" do
  @item.should_receive(:calculate_total).once
  2.times do 
    @item.total.should == 123
  end
end
0 голосов
/ 20 января 2012

Вы можете вызвать его дважды в одной и той же спецификации и сравнить возвращаемые объекты, чтобы убедиться, что они равны:

it "should memoize it" do
  total = Item.total
  # second call will yield a different object if not memoized
  Item.total.should == total
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...