【问题标题】:How can I approve a PayPal payment in my specs?如何在我的规范中批准 PayPal 付款?
【发布时间】:2018-12-11 22:41:36
【问题描述】:

我对 PayPal API 很陌生。

我的 rails 服务器会检查每笔付款是否获得批准。我正在努力为其编写规范,因为我不知道如何“伪造”批准。

我想出了 3 种可能性:

  1. 我没有在我的规范中检查批准。
  2. 我创建了一个真正的沙盒支付,并始终使用该支付的paymentId
  3. 我只测试隐含付款(无需批准)。

我觉得这三个都不是很好。

所以问题仍然存在:我怎样才能为我的规格创建一个批准的付款?

【问题讨论】:

    标签: ruby-on-rails paypal paypal-sandbox paypal-rest-sdk


    【解决方案1】:

    您应该模拟来自 api 的响应。您无需实际执行请求,也没有理由不测试您处理 api 请求结果的代码。假设您要模拟以下代码:

    #controller.rb
    
    def initialize(dependencies = {})
      @payment_service = dependencies.fetch(:paypal_api) do
        Payment
      end
    end
    
    ...
    
    def payment_method
      payment = @payment_service.find("PAY-57363176S1057143SKE2HO3A")
    
      if payment.execute(payer_id: "DUFRQ8GWYMJXC")
        # Do some stuff 
        return 'success!'
      end
      'failure!'
    end
    

    您可以在 Rspec 中使用类似的内容来模拟您的响应:

    # controller_spec.rb
    
    let(:paypal_api) { double('Payment') } 
    let(:mock_payment) { double('PayPal::SDK::REST::DataTypes::Payment') } 
    let(:mock_controller) { described_class.new(paypal_api: paypal_api) }
    ...
    
    it 'returns the correct result when the payment is successfull' do
      mock_response = {
         "paymentExecuteResponse":{
            "id":,
            "intent":"sale",
            "state":"approved",
            "cart":,
            "payer":{
               "payment_method":"paypal",
               "payer_info":{
                  "email":,
                  "first_name":,
                  "last_name":,
                  "payer_id":,
                  "phone":,
                  "country_code":
               }
            }
            ... some other stuff...
         }
      }
    
      ...
      # This mocks the find method from the sdk
      allow(paypal_api).to receive(:find).and_return(mock_payment)
      # This mocks the execution of the payment
      allow(mock_payment).to receive(:execute).and_return(mock_response)
    
      result = mock_controller.payment_method
      expect(result).to 'success!'
    end
    

    我还建议您查看关于双打的rspec docs

    【讨论】:

    • 这是一个很好的答案。我正在为class_double(Payment)uninitialized constant Payment 苦苦挣扎。我在一个模块中包含PayPal::SDK::REST
    • @Fabic 如果您对模拟的确切类名有疑问,您可以使用常规的doubles 而不是instance_doubles。实例/类双打更好,因为它们更接近真实事情,但在这种情况下应该没问题。我将更新示例以使用普通双打。
    猜你喜欢
    • 2013-12-26
    • 2013-05-26
    • 2017-11-17
    • 2016-12-24
    • 2013-09-03
    • 2021-10-11
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多