Я пишу тест в Laravel 5.8, чтобы проверить, созданы ли некоторые записи базы данных, существуют ли связи и т. Д. После вызова API.
Вызов API вызывает метод в классе, который создает свой собственныйвызов API для внешнего сервиса, который необходим в реальном мире, но в тесте меня это не волнует.
Я хочу смоделировать этот класс / метод, чтобы он возвращал определенное значение, чтобы я мог забытьоб этом в тесте.
Вот мой тест ниже, я попытался смоделировать класс PayPointAdapter
и, в частности, метод makePayment
.
/** @test */
public function client_can_make_a_payment()
{
$client = factory(Client::class)->create();
$invoice = factory(Invoice::class)->create([
'client_id' => $client->id
]);
$card = factory(PaymentCard::class)->make([
'client_id' => $client->id
]);
$this->assertCount(0, $client->payments);
$this->assertCount(0, $client->paymentCards);
$mock = \Mockery::Mock(PayPointAdapter::class)
->allows(['makePayment' => ["status" => "success", "transid" => 123]]);
$response = $this->json(
'POST',
'/api/payments',
[
'invoiceid' => $invoice->id,
'amount' => $invoice->total(),
'clientdetails-firstname' => $client->first_name,
'clientdetails-lastname' => $client->last_name,
'clientdetails-email' => $client->email,
'clientdetails-address1' => $client->address_line_one,
'clientdetails-address2' => $client->address_line_two,
'clientdetails-city' => $client->city,
'clientdetails-state' => $client->state,
'clientdetails-postcode' => $client->postcode,
'clientdetails-phonenumber' => '',
'cardtype' => $card->type,
'cardnum' => $card->number,
'cardexp' => $card->expiry,
'cardstart' => $card->start,
'cardissuenum' => $card->issue,
'cccvv' => $card->ccv
]
);
$response->assertStatus(201);
$client->refresh();
$invoice->refresh();
$this->assertCount(1, $client->paymemnts);
$this->assertCount(1, $client->paymentCards);
$this->assertDatabaseHas('payment_cards', $card->toArray());
$this->assertTrue($invoice->isPaid());
}
Вот метод вконтроллер, который обрабатывает вызов API
/**
* Make a payment.
*
* @param \Illuminate\Http\Request $request
*
* @return bool
*/
public function store(Request $request)
{
try {
$payment = $this->payPointAdapter->makePayment($request->all());
$card = PaymentCard::where('type', request('cardtype'))
->where('expiry', request('cardexp'))
->where('start', request('cardstart'))
->where('ccv', request('cccvv'))
->get()
->filter(function ($paymentCard) {
return $paymentCard->number == request('cardnum');
});
if (!$card) {
$card = PaymentCard::create([
'number' => request('cardnum'),
'type' => request('cardtype'),
'expiry' => request('cardexp'),
'start' => request('cardstart'),
'issue' => request('cardissuenum')
]);
}
Payment::create([
'invoice_id' => request('invoiceid'),
'amount' => request('amount'),
'payment_method' => request('payment_method'),
'payment_card_id' => $card->id,
'reference' => $payment['transid']
]);
return response($payment, 201);
} catch (\Exception $ex) {
return response($ex->getMessage(), 500);
}
}
Так что я просто хочу проигнорировать вызов метода $this->payPointAdapter->makePayment($request->all());
и получить тест для проверки ответа на него.
В моем тестеиздевательство, которое я создал, не останавливает запуск метода.Есть идеи?