我们正在添加 PayPal Express Checkout 作为签出在 Rails 2.3.18 上运行的电子商务应用程序的选项。我已经为我的自定义PayPal::Merchant::ExpressCheckout
模块完成了代码工作和一些单元测试,但是我无法理解如何正确地模拟或存根控制器方法,以便我可以编写集成测试。
我面临的一个问题是所有 PayPal API 调用都指向同一个端点 URI,在 POST 数据中只有一个动作参数来区分我们正在调用的动作。虽然我已成功设置 FakeWeb 以在我的单元测试中模拟来自 PayPal API 的正确 XML 响应,但在某些集成场景中,我需要能够处理背靠背的 API 请求。有没有办法告诉 FakeWeb 根据发布的数据做出不同的响应?或者,有没有办法让 FakeWeb 在拦截第一个请求后触发回调方法,以便我可以设置下一个请求?
另一个问题是如何模拟到 PayPal 的重定向。现在,用户单击我们网站上的 Checkout With PayPal 按钮,该按钮将他们重定向到setup
my 上的方法ExpressCheckoutsController
,该方法获取令牌并设置结帐 URL,然后将用户重定向到那里。我需要在集成测试中模拟两个场景: 1. 用户正确提交表单并发送到我的返回 URL 2. 用户取消并发送到我的取消 URL 有没有办法在不重写整个 ExpressCheckoutsController 的情况下做到这一点测试文件中的类?
万一这很重要,我们使用的是 paypal-sdk-merchant gem。我们的测试环境使用以下 gem:
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 来存根我的自定义ExpressCheckout
模块的express_checkout_url
方法来解决重定向问题,以便它简单地重定向到return
orcancel
操作。
PayPal::Merchant::ExpressCheckout.any_instance.stubs(:express_checkout_url).returns(return_order_express_checkout_path)