Rspec 2: обнаружить вызов метода, но все же выполнить его функцию

Я хочу проверить, был ли метод вызван точно (n) раз, но я все еще хочу, чтобы этот метод выполнял свою оригинальную функцию. Рассмотрим простую миниатюрную систему, которая кэширует файл миниатюр и гарантирует, что исполняемый файл ImageMagick "convert", создающий миниатюру, вызывается только при первом запросе.

  it "this passes: should detect a cached version" do
    thumbnail_url = thumbnail_url_for("images/something.jpg")
    get thumbnail_url
    last_response.should be_ok
    Sinatra::Thumbnail.should_not_receive(:convert)
    get thumbnail_url
    last_response.should be_ok
  end

  it "this fails:  should detect a cached version" do
    Sinatra::Thumbnail.should_receive(:convert).exactly(1).times
    thumbnail_url = thumbnail_url_for("images/something.jpg")
    get thumbnail_url
    last_response.should be_ok
    get thumbnail_url
    last_response.should be_ok
 end

В моем случае я ухожу с первой попытки, но могут быть случаи, когда я этого не делаю. Вторая неудачна, потому что обнаружен вызов Thumbnail.convert, но сам метод ничего не делает. Есть ли способ определить вызов метода и сделать его оригинальным?

Кстати: я подозреваю, что этот question очень похож, но потом я теряюсь в описании, а также он не отвечает...

Ответ 1

Теперь существует метод and_call_original точно для этого варианта использования. (RSpec 2.12)

Sinatra::Thumbnails.should_receive(:convert).and_call_original

Документацию можно найти на той же странице, на которую ссылается Joao, здесь.

Смотрите также: changelog

Ответ 2

Ура! Кажется, я понял это!

it "should detect a cached version" do
  original_method = Sinatra::Thumbnails.method(:convert)
  Sinatra::Thumbnails.should_receive(:convert).exactly(1).times do |*args|
    original_method.call(*args)
  end
  thumbnail_url = thumbnail_url_for("images/something.jpg") # 
  get thumbnail_url
  last_response.should be_ok
  get thumbnail_url
  last_response.should be_ok
end

Он задокументировал (плохо, на мой взгляд), в здесь в самом конце...