Модульное тестирование с помощью синглтона внутри метода проверки в Laravel - PullRequest
0 голосов
/ 13 мая 2018

Я зарегистрировал синглтон в сервис-провайдере (который использует клиент Guzzle в своем конструкторе):

public function register()
{
    $this->app->singleton(Channel::class, function ($app) {
        return new ChannelClient(new Client([
            'http_errors'=> false,
            'timeout' => 10,
            'connect_timeout' => 10
        ]));
    });
}

У меня есть метод проверки:

 public static function validateChannel($attribute, $value, $parameters, \Illuminate\Validation\Validator $validator)
    {
        $dataloader = app()->make(\App\Client\Channel::class);
        if($dataloader->search($value)){
            return true;
        }
    }

В PHPUnitТест, как я могу заменить app()->make(\App\Client\Channel::class); на поддельный класс Client, но все же протестировать функцию проверки в тесте?

1 Ответ

0 голосов
/ 13 мая 2018

Чтобы использовать макет в своих тестах, вы можете сделать что-то вроде этого:

public function test_my_controller () {
    // Create a mock of the Random Interface
    $mock = Mockery::mock(RandomInterface::class);

    // Set our expectation for the methods that should be called
    // and what is supposed to be returned
    $mock->shouldReceive('someMethodName')->once()->andReturn('SomeNonRandomString');

    // Tell laravel to use our mock when someone tries to resolve
    // an instance of our interface
    $this->app->instance(RandomInterface::class, $mock);

    $this->post('/api/v1/do_things', ['email' => $this->email])
         ->seeInDatabase('things', [
             'email' => $this->email, 
             'random' => 'SomeNonRandomString',
         ]);
}

Обязательно ознакомьтесь с издевательской документацией:

http://docs.mockery.io/en/latest/reference/expectations.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...