Как смоделировать метод с ожиданием того, что передается в блок - PullRequest
0 голосов
/ 05 ноября 2010

Допустим, у нас есть класс:

class ObjectWithCaching
  def cached_attribute(key, cache_handler)
    cache_handler.cache(key) { expensive_operation }
  end

  def expensive_operation
    #...
  end
end

И мы уже протестировали cache_handler, поэтому мы знаем, что он будет выполнять блок только тогда, когда key не найден в cache.

Мы хотим проверить, правильно ли выполнен cache_handler # cache.

Вопрос: Как написать оставшуюся ожидающую спецификацию?

describe ObjectWithCaching, "#cached_attribute" do
  let(:key) { double }
  let(:cache_handler) { double }

  specify do
    cache_handler.should_receive(:cache).with(key)
    subject.cached_attribute(key, cache_handler)
  end

  it "passes #expensive_operation to block of cache_handler#cache" do
    pending
    subject.cached_attribute(key, cache_handler)
  end
end

1 Ответ

2 голосов
/ 05 ноября 2010

Вот что я бы сделал. Это немного грязно, когда вы издеваетесь над другим методом на том же объекте (может expensive_operation принадлежать другому классу?), Но, учитывая ограничения, я думаю, что это путь Было бы неплохо иметь возможность передавать функции напрямую и просто проверять равенство функций, как в Clojure:)

it "passes #expensive_operation to block of cache_handler#cache" do
  cache_handler.stub!(:cache) do |k, block|
    subject.should_receive(:expensive_operation)
    block.call
  end 

  subject.cached_attribute(key, cache_handler)
end
...