Как я могу одобрить платеж PayPal в моих спецификациях? - PullRequest
0 голосов
/ 03 июля 2018

Я очень плохо знаком с PayPal API.

Мой сервер рельсов проверяет каждый платеж, если он одобрен. Я борюсь с написанием спецификаций для него, потому что я не знаю, как я могу «подделать» одобрение.

Я придумал 3 варианта:

  1. Я не проверяю одобрение в моих спецификациях.
  2. Я создаю реальный платеж в песочнице и всегда использую paymentId этого платежа.
  3. Я тестирую только с неявными платежами (которые не требуют одобрения).

Все 3 выглядят не очень хорошо для меня.

Таким образом, остается вопрос: Как я могу создать утвержденный платеж для моих спецификаций?

1 Ответ

0 голосов
/ 03 июля 2018

Вы должны посмеяться над ответом 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 о двойниках.

...