PHPUnit: куда я должен бросить исключение (метод ExException)? - PullRequest
1 голос
/ 12 апреля 2020

Я знаю, что обе версии верны, но я хотел бы знать, какая из них "лучше". Проблема с методом expectException() заключается в том, что он написан до того, как вы наберете метод, запускающий исключение.

У меня вопрос, должен ли я поместить их в начало метода (чтобы они были более заметны) или нет? только перед методом, который вызывает исключение (я думаю, что это имеет больше смысла)?

  • Вариант A)
/** @test */
public function shouldThrowsAnException(): void
{
    $this->expectException(RuntimeException::class);
    $this->expectExceptionMessage('Error message');

    $foo = new Foo();
    $foo->bar(); // <-- This method launches the exception!!
}
  • Вариант B)
/** @test */
public function shouldThrowsAnException(): void
{
    $foo = new Foo();

    $this->expectException(RuntimeException::class);
    $this->expectExceptionMessage('Error message');
    $foo->bar(); // <-- This method launches the exception!!
}

1 Ответ

2 голосов
/ 14 апреля 2020

При написании юнит-тестов каждый юнит должен тестировать только одну вещь. Таким образом, ваш expectException должен быть как можно более точным c, как вы указали в своем коде, ища конкретное исключение и конкретное сообщение.

Если ваш конструктор выдал такое же исключение, тогда вариант B будет лучшим вариантом, поэтому вы не поймаете исключение конструктора случайно. Если конструктор выбрасывает исключения, вы должны были бы написать другие тестовые случаи, которые выводят конструктор из потока sh.

Если конструктор не выдает никаких исключений, два модульных теста совпадают с выполнением.

Если вы спрашивали с точки зрения читабельности, тогда вариант B более читабелен, поскольку очевидно, что ожидается, что ваш метод Bar вызовет исключение.

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