Industry standard, lambda-based exception testing assertions for PHPUnit.
Easily install it with composer:
composer require --dev jchook/phpunit-assert-throwsOr, alternatively copy the tiny gist and add it to you project. No attribution is requried. True artists steal.
To enable lambda-based exception testing syntax to PHPUnit.
- Throw multiple errors per test
- Examine and test errors after they are caught
- Copy-paste usage examples
- Use standard
assert*syntax - Test more than just
message,code, andclass - Write simple happy-path tests with
assertNotThrows
Just to illustrate the spirit behind the syntax:
<?php// Within your test case...$x = newMyTestedObject();
$this->assertThrows(
MyException::class,
fn() => $x->doSomethingBad()
);The class below demonstrates more advanced features.
<?phpdeclare(strict_types=1);
// PHPUnitusePHPUnit\Framework\TestCase;
// This libraryuseJchook\AssertThrows\AssertThrows;
// Your classesuseMyNamespace\MyException;
useMyNamespace\MyObject;
finalclass MyTest extends TestCase
{
use AssertThrows; // <--- adds the assertThrows methodpublicfunctiontestMyObject()
{
$obj = newMyObject();
// Ensure that a function throws a specific exception$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 method does *NOT* throw$this->assertNotThrows(MyException::class, function() use ($obj) {
$obj->doSomethingGood();
});
}
}
?>Yes, assertNotThrows() feels grammatically… odd. However, it conforms with the PHPUnit naming conventions, such as assertNotContains(). Additionally, the PHPUnit team suggests we may not need this inverse assertion.
MIT