Мы находимся в процессе добавления PayPal Express Checkout в качестве опции для проверки из приложения ecom, работающего на Rails 2.3.18. У меня есть рабочий код и несколько модульных тестов для моего пользовательского модуля PayPal::Merchant::ExpressCheckout
, но я не понимаю, как правильно имитировать или заглушать методы контроллера, чтобы я мог писать интеграционные тесты.
Одна проблема, с которой я столкнулся, заключается в том, что все вызовы API PayPal относятся к одному и тому же URI конечной точки с только параметром действия в данных POST, чтобы различать, какое действие мы вызываем. Хотя я успешно настроил FakeWeb для имитации правильных ответов XML от PayPal API в своих модульных тестах, есть несколько сценариев интеграции, в которых мне нужно иметь возможность обрабатывать параллельные запросы API. Есть ли способ заставить FakeWeb реагировать по-разному в зависимости от отправленных данных? В качестве альтернативы, есть ли способ заставить FakeWeb вызывать метод обратного вызова после перехвата первого запроса, чтобы я мог настроить следующий запрос?
Другая проблема заключается в том, как смоделировать перенаправление на PayPal. Прямо сейчас пользователь нажимает кнопку «Оформить заказ через PayPal» на нашем сайте, которая перенаправляет его к методу setup
на моем ExpressCheckoutsController
, который получает токен и устанавливает URL-адрес оформления заказа, а затем перенаправляет пользователя туда. Мне нужно смоделировать два сценария в моих интеграционных тестах: 1. Пользователь правильно отправляет форму и отправляется на мой обратный URL-адрес 2. Пользователь отменяет и отправляется на мой URL-адрес отмены. Есть ли способ сделать это, не переписывая весь ExpressCheckoutsController класс в тестовом файле?
Если это имеет значение, мы используем гем paypal-sdk-merchant. В нашей тестовой среде используются следующие драгоценные камни:
group :test do
gem 'autotest-rails', '4.1.0'
gem 'ZenTest', '< 4.6'
gem 'fakeweb', '1.2.6'
gem 'mocha', '0.9.4'
gem 'quietbacktrace', '0.1.1'
gem 'factory_girl', '1.2.0'
gem 'thoughtbot-shoulda', '2.10.2', :require => 'shoulda'
gem 'nokogiri', '1.5.6'
gem 'webrat', '0.4.4'
end
ОБНОВЛЕНИЕ
Я смог выяснить проблему перенаправления, используя Mocha, чтобы заглушить метод express_checkout_url
моего пользовательского модуля ExpressCheckout
, чтобы он просто перенаправлял на действия return
или cancel
.
PayPal::Merchant::ExpressCheckout.any_instance.stubs(:express_checkout_url).returns(return_order_express_checkout_path)