PHPUnit макет метода класса, чтобы вернуть определенное значение после вызова API - PullRequest
0 голосов
/ 30 мая 2019

Я пишу тест в 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()); и получить тест для проверки ответа на него.

В моем тестеиздевательство, которое я создал, не останавливает запуск метода.Есть идеи?

...