Ruby on Rails: лучший способ проверить неудачный вызов стороннего API

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

Что меня интересует, так это наличие достаточно хороших тестов, ничего особенного, где я могу имитировать реакцию моего приложения, когда сторонняя веб-служба по какой-либо причине недоступна. Будь то, что я превысил ограничение скорости или тайм-аут из-за задержки / осложнений в сети, я просто хочу иметь возможность получить что-то вроде кода состояния HTTP и проверить, что мое приложение делает в этом случае.

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

Использует ли дополнительный каркас рядом с Test:: Unit, который может "заглушить" правильный путь сделать это? Очевидно, я не могу форсировать тайм-аут сети, и начинать взламывать такие вещи, как IPtables только для тестов, не стоит времени. Я уверен, что эта проблема решалась миллион раз, так как интеграция таких вещей, как Facebook и Twitter в веб-приложения, сегодня очень популярна. Как вы проверяете ошибки при достижении этих API в надежном / контролируемом формате?

2 ответа

Решение

Я бы порекомендовал использовать что-то вроде webmock для насмешки над всеми вашими http-запросами (а не только над насмешкой над ошибочным запросом) это значительно ускорит ваш набор тестов, вместо того, чтобы фактически запускать стороннюю службу каждый раз, когда вы запускаете тесты.

Webmock поддерживает Rest Client и Test::Unit. Просто вставьте этот код в свой test/test_helper.rb файл:

require 'webmock/test_unit' 

Например, чтобы проверить время ожидания сети:

stub_request(:any, 'www.example.net').to_timeout
RestClient.post('www.example.net', 'abc')    # ===> RestClient::RequestTimeout

railscast: 291 (только подписчик) говорит о тестировании с видеомагнитофоном и rspec (я знаю, это не Test:Unit)

в любом случае вы могли бы изучить использование видеомагнитофона для такого рода вещей

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