Комплексное решение
Текущий PHPUnit " лучшие практики " для тестирования исключений кажутся .. тусклыми ( документы ).
Поскольку я хотел больше , чем текущая реализация expectException
, я использовал эту черту в своих тестовых примерах. Это всего лишь ~ 50 строк кода .
- Поддерживает несколько исключений для теста
- Поддерживает утверждения, вызываемые после возникновения исключения
- Надежные и понятные примеры использования
- Стандартный
assert
синтаксис
- Поддерживает утверждения не только для сообщения, кода и класса
- Поддерживает обратное утверждение,
assertNotThrows
- Поддержка PHP 7
Throwable
Ошибки
Библиотека
Я опубликовал черту AssertThrows
для Github и packagist , чтобы ее можно было установить с помощью composer.
Простой пример
Просто чтобы проиллюстрировать дух синтаксиса:
<?php
// Using simple callback
$this->assertThrows(MyException::class, [$obj, 'doSomethingBad']);
// Using anonymous function
$this->assertThrows(MyException::class, function() use ($obj) {
$obj->doSomethingBad();
});
Довольно аккуратно?
Пример полного использования
Более подробный пример использования см. Ниже:
<?php
declare(strict_types=1);
use Jchook\AssertThrows\AssertThrows;
use PHPUnit\Framework\TestCase;
// These are just for illustration
use MyNamespace\MyException;
use MyNamespace\MyObject;
final class MyTest extends TestCase
{
use AssertThrows; // <--- adds the assertThrows method
public function testMyObject()
{
$obj = new MyObject();
// Test a basic exception is thrown
$this->assertThrows(MyException::class, function() use ($obj) {
$obj->doSomethingBad();
});
// Test custom aspects of a custom extension class
$this->assertThrows(MyException::class,
function() use ($obj) {
$obj->doSomethingBad();
},
function($exception) {
$this->assertEquals('Expected value', $exception->getCustomThing());
$this->assertEquals(123, $exception->getCode());
}
);
// Test that a specific exception is NOT thrown
$this->assertNotThrows(MyException::class, function() use ($obj) {
$obj->doSomethingGood();
});
}
}
?>