Напишите юнит-тест для try catch в laravel 5.8 - PullRequest
3 голосов
/ 28 октября 2019

У меня есть что-то вроде этого в моем контроллере:

public function method()
{
    try {
        $data = Model::method();

        return $data;
    } catch (Exception $e) {
        return $e->getMessage();
    }
}

, пока я ищу написание модульного теста для этого метода, таким образом:

public function testMethod()
{
    $var = (new \App\Http\Controllers\MyController)->method();

    $this->assertTrue(true);
}

мой вопроскогда я запускаю phpunit в режиме покрытия кода, возвращается, что блок catch в коде моего контроллера не охватывается.

первый вопрос: как мне покрыть блок catch?

и мой второйвопрос в том, как я могу сказать, что $ var значения равны тому, что я определяю.

1 Ответ

0 голосов
/ 28 октября 2019

Если вы хотите проверить, что $var соответствует чему-то конкретному, вы бы использовали $this->assertEquals(mixed $expected, mixed $actual[, string $message = ''])

Так что, если вы ожидали, что $var равно 'hello', вы должны написать следующее:

$this->assertEquals('hello', $var, 'optional message to display on test failure'

Вы можете узнать больше о assertEquals здесь .

С точки зрения первого вопроса. Если вы можете получить исключение через передачу определенного параметра в метод контроллера, то это будет проще всего. В противном случае вам нужно смоделировать Model и при вызове функции выдать исключение, чтобы вызвать блок catch.

Вы можете сделать это с чем-то вроде:

    $mock = Mockery::mock('\App\Model');
    $mock->shouldReceive('method')->once()
        ->andThrow(new \Exception('Fun exception'));
    $this->app->instance('\App\Model', $mock);
...