首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Rails 2.3应用程序中使用PayPal快速签出配置集成测试

如何在Rails 2.3应用程序中使用PayPal快速签出配置集成测试
EN

Stack Overflow用户
提问于 2013-10-23 15:52:23
回答 1查看 1K关注 0票数 1

我们正在添加PayPal快捷签出,作为在Rails 2.3.18上运行的ecom应用程序的签出选项。我已经为我的自定义PayPal::Merchant::ExpressCheckout模块提供了代码和一些单元测试,但我很难理解如何正确地模拟或存根控制器方法,以便编写集成测试。

我面临的一个问题是,所有的PayPal API调用都指向同一个端点URI,在POSTed数据中只有一个操作参数来区分我们正在调用的操作。虽然我已经在单元测试中成功地设置了FakeWeb以模拟来自PayPal API的适当的XML响应,但是在一些集成场景中,我需要能够处理背对背的PayPal请求。有没有一种方法可以告诉FakeWeb根据POSTed数据做出不同的响应?或者,在FakeWeb拦截第一个请求之后,是否有一种方法可以让它触发回调方法,这样我就可以设置下一个请求了?

另一个问题是如何模拟重定向到PayPal。现在,用户单击站点上的Checkout按钮,该按钮将他们重定向到我的ExpressCheckoutsController上的一个setup方法,该方法获取令牌并设置签出URL,然后将用户重定向到那里。我需要在集成测试中模拟两种情况: 1.用户正确地提交表单并发送到我的返回URL 2。用户取消并被发送到我的cancel URL,有没有办法做到这一点而不重写测试文件中的整个ExpressCheckoutsController类?

如果有关系,我们正在使用paypal-sdk-商人宝石。我们的测试环境使用以下gems:

代码语言:javascript
复制
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方法进行存根来解决重定向问题,这样它就可以简单地重定向到returncancel操作。

代码语言:javascript
复制
PayPal::Merchant::ExpressCheckout.any_instance.stubs(:express_checkout_url).returns(return_order_express_checkout_path)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-24 00:58:47

我了解到FakeWeb支持旋转响应,虽然这在一些集成测试步骤中有所帮助,但我仍然遇到了GetExpressCheckoutDetails API方法在SetExpressCheckoutDoExpressCheckoutPayment调用之间被调用不定次数的情况,这取决于其他几个因素。与其试图找出我需要伪造多少响应,而且在深入研究了大量的PayPal::SDK::Core库之后,我在我的集成测试类中得到了这个帮助方法:

代码语言:javascript
复制
def stub_express_checkout
  api = PayPal::SDK::Merchant::API.new

  PayPal::Merchant::ExpressCheckout.any_instance.stubs(:express_checkout_url).returns(return_order_express_checkout_path)

  FakeWeb.register_uri(
    :post,
    api.service_endpoint,
    :content_type => "application/xml",
    :status => ["200", "OK"],
    :body => ""
  )

  PayPal::Merchant::ExpressCheckout.any_instance.stubs(:set_express_checkout).returns(
    PayPal::SDK::Merchant::DataTypes::SetExpressCheckoutResponseType.new(api.format_response({
      :response => FakeWeb.response_for(:post, api.service_endpoint).tap { |resp| 
        resp.instance_variable_set("@body", File.read(Rails.root.join("test/fixtures/express_checkout/success/set.xml")))
      }
    })[:data])
  )

  PayPal::Merchant::ExpressCheckout.any_instance.stubs(:get_express_checkout).returns(
    PayPal::SDK::Merchant::DataTypes::GetExpressCheckoutDetailsResponseType.new(api.format_response({
      :response => FakeWeb.response_for(:post, api.service_endpoint).tap { |resp| 
        resp.instance_variable_set("@body", File.read(Rails.root.join("test/fixtures/express_checkout/success/get.xml")))
      }
    })[:data])
  )

  PayPal::Merchant::ExpressCheckout.any_instance.stubs(:do_express_checkout).returns(
    PayPal::SDK::Merchant::DataTypes::DoExpressCheckoutPaymentResponseType.new(api.format_response({
      :response => FakeWeb.response_for(:post, api.service_endpoint).tap { |resp| 
        resp.instance_variable_set("@body", File.read(Rails.root.join("test/fixtures/express_checkout/success/do.xml")))
      }
    })[:data])
  )

  FakeWeb::Registry.instance.uri_map[FakeWeb::Registry.instance.send(:normalize_uri, api.service_endpoint)] = {}
end

它很难看,而且我不喜欢依赖如此多的内部PayPal::SDK::Core方法来对模块方法进行存根,但在我尝试的20多种方法中,这一种方法终于起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19546520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档