Closed
Description
Q | A |
---|---|
PHPUnit version | 6.5.7 |
PHP version | 7.1.16 |
Installation Method | PHAR |
Goal: to test exceptions.
After reading through SO I found #1798, which was closed in a routine issue clean-up. As suggested, I am re-opening this issue.
Please forgive any ignorance I have about the design decisions of the expectException
family of methods, but I still find this particular suggestion to be a good direction on having a callback-based exception testing pattern.
/**
* @param string $type
* @param string|null $message
* @param callable $function
*/
protected function assertException($type, $message, callable $function)
{
$exception = null;
try {
call_user_func($function);
} catch (Exception $e) {
$exception = $e;
}
self::assertThat($exception, new PHPUnit_Framework_Constraint_Exception($type));
if ($message !== null) {
self::assertThat($exception, new PHPUnit_Framework_Constraint_ExceptionMessage($message));
}
}
While I realize this example is far from a complete replacement, I think we could build from this pattern to give users more control over exception testing, and a more familiar assertion pattern that doesn't require calling $this->fail()
, etc.
Here is a theoretical usage example (of a currently non-existent assertException
):
$this->assertException(MyException::class, 'doStuff',
function($exception, $phpUnit) {
$phpUnit->assertEquals('Some message', $exception->getMessage());
$phpUnit->assertEquals(123, $exception->getCode());
$phpUnit->assertEquals('custom value', $exception->getCustomThing());
}
);
Metadata
Metadata
Assignees
Labels
No labels