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

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

  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 обнаружен, но сам метод ничего не делает. Есть ли какой-то способ просто обнаружить вызов метода и заставить его делать это оригинально?

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

2 ответа

Решение

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

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

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

Смотрите также: список изменений

Ура! Я думаю, что я понял это!

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

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

Другие вопросы по тегам