Насмешливая полоса класса из полосы php в упаковке laravel - PullRequest
0 голосов
/ 19 февраля 2020

Я использую этот пакет для Stripe

https://github.com/stripe/stripe-php

У меня есть класс, который я использую, который использует методы StripeBiller

class StripeBiller
{

    public function setApiKey() {
        $stripe = new Stripe();
        $stripe->setApiKey(env('STRIPE_API_KEY'));
    }
}

Я пытаюсь проверить, что метод setApiKey вызывается при вызове $stripebiller()->setApiKey(). Для этого я проверяю класс полосы в тесте.

    public function test_api_key_is_set() {

    $this->mock(Stripe::class, function ($mock) {
        $mock->shouldReceive('setApiKey')->once();
    });
    $biller = new StripeBiller();
    $biller->setApiKey();

}

При выполнении этого теста я получаю эту ошибку.

    Mockery\Exception\InvalidCountException : Method setApiKey(<Any Arguments>) from Mockery_2_Stripe_Stripe should be called
 exactly 1 times but called 0 times.

Как правильно издеваться над этим классом полосы

1 Ответ

1 голос
/ 19 февраля 2020

Вы не можете издеваться над вещами, которые вы вручную new поднимаете. Есть несколько способов выполнить sh то, что вы пытаетесь сделать здесь.

  1. Передайте класс Stripe в конструктор вашего StripeBiller класса
class StripeBiller
{
    private $Stripe;

    public function __construct(Stripe $Stripe)
    {
        $this->Stripe = $Stripe;
    }

    public function setApiKey() 
    {
        $this->Stripe->setApiKey(env('STRIPE_API_KEY'));
    }
}
// StripeBillerTest.php
public function test_api_key_is_set()
{
    $StripeMock = \Mockery::mock(Stripe::class);
    $StripeMock->shouldReceive('setApiKey')->once();

    $biller = new StripeBiller($StripeMock);
    $biller->setApiKey();

}

Создайте класс Stripe с контейнером и попросите контейнер использовать макет в вашем тесте.
// StripeBiller.php
public function setApiKey() 
{
    $stripe = app(Stripe::class);
    $stripe->setApiKey(env('STRIPE_API_KEY'));
}
// StripeBillerTest.php
public function test_api_key_is_set()
{
    $StripeMock = \Mockery::mock(Stripe::class);
    $StripeMock->shouldReceive('setApiKey')->once();
    $this->app->instance(Stripe::class, $StripeMock);

    $biller = new StripeBiller();
    $biller->setApiKey();

}

...