PHPSpec: фиктивный статический метод

Я тестирую класс с PHPSpec, который идет нормально, пока я не хотел создать макет для класса, который имеет статические функции.

Класс, который я тестирую:

<?php

namespace App\Service;

class PaymentService
{

    public function paymentVerification($orderId, array $data)
    {
        ...

        // Get the payment details
        $payment = \PayPal\Api\Payment::get($data['payKey'], $apiContext);

        ...
    }
}

Класс PHPSpec:

<?php

namespace App\Spec\Service;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;

class PaymentServiceSpec extends ObjectBehavior
{
    /**
     * @param \PayPal\API\Payment $payment
     */
    function it_should_return_false_when_the_payment_verification_failed($payment)
    {
        ...
        // This throws a PHP Fatal error:  Call to undefined method PhpSpec\Wrapper\Collaborator::get() in
        $payment::get(Argument::exact($data['payKey']), Argument::exact($apiContext))->shouldReturn(array('foobar'));

        ...

        $this->paymentVerification($orderId, $data)->shouldReturn(false);
    }
}

Как я могу издеваться над \PayPal\Api\Payment::get($data['payKey'], $apiContext);? В настоящее время это приводит к фатальной ошибке PHP: вызов неопределенного метода PhpSpec\Wrapper\Collaborator::get()

Как это можно сделать правильно? Заранее спасибо!

1 ответ

Решение

Вы должны избегать этого. Создайте тонкий слой, который обернет библиотеку PayPal. Дразнить свои собственные вещи.

См. https://github.com/phpspec/prophecy/pull/20.

Другие вопросы по тегам