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
Он задокументировал (плохо, на мой взгляд), в здесь в самом конце...