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