PHP 7.4 and PHPUnit 9
Using the PHPUnit homepage example (https://phpunit.de/getting-started/phpunit-9.html):
private function ensureIsValidEmail(string $email): void
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException(
sprintf(
'"%s" is not a valid email address',
$email
)
);
}
}
The homepage also shows us how to test the exception is thrown using the expectException() method:
public function testCannotBeCreatedFromInvalidEmailAddress(): void
{
$this->expectException(InvalidArgumentException::class);
Email::fromString('invalid');
}
That's great. But what if I want to test the exception is not thrown given valid input ?
Looking at the docs (https://phpunit.readthedocs.io/en/9.3/writing-tests-for-phpunit.html#testing-exceptions) there seems to be no mention of an inverse method to expectException() ?
How should I approach this ?
EDIT TO ADD:
Just to make it perfectly clear, I'm looking to test an Email::fromString('[email protected]'); scenario, i.e. that the exception is not thrown.
If an uncaught or unexpected exception is thrown, the test will fail. You don't have to do anything special, just run the code being tested. If there are no other assertions in the test method, you'll also have to do $this->expectNotToPerformAssertions(); or you'll get a warning that the test doesn't perform any assertions.
public function testCannotBeCreatedFromInvalidEmailAddress(): void
{
$this->expectNotToPerformAssertions();
Email::fromString('invalid'); // If this throws an exception, the test will fail.
}
PHPUnit does not provide a way to check that no exception is thrown.
Contrary to what the accepted answer states, if an uncaught exception or error is thrown, your test will not fail, it will error instead.
Errors and failure are different, both in meaning and in function.
A test failure means your application code is not behaving as you would like it to do, e.g. does not conform to your project requirements.
Errors mean something is unexpectedly wrong with your code. It can be your application code, your configuration, or that something is bad with your tests.
While you could rely on errors to test your code, that’s what assertions (and, test failures) are for in the first place and it just seems like bad practice to me. Not only are errors categorised differently from test failures, the return code of PHPUnit is even different: 1 for test failures, 2 for errors during testing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With