PHP 7.4 和 PHPUnit 9
使用 PHPUnit 主页示例 (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
)
);
}
}
主页还向我们展示了如何使用
expectException()
方法测试抛出异常:
public function testCannotBeCreatedFromInvalidEmailAddress(): void
{
$this->expectException(InvalidArgumentException::class);
Email::fromString('invalid');
}
那太好了。但是,如果我想测试给定有效输入时抛出的异常是not怎么办?
查看文档(https://phpunit.readthedocs.io/en/9.3/writing-tests-for-phpunit.html#testing-exceptions)似乎没有提到
expectException()
的逆方法?
我应该如何处理这个问题?
编辑添加:
为了完全清楚地表明,我正在测试一个
Email::fromString('[email protected]');
场景,即异常是 not 抛出。
如果抛出未捕获或意外的异常,测试将失败。您不必做任何特殊的事情,只需运行正在测试的代码即可。如果测试方法中没有其他断言,您还必须执行
$this->expectNotToPerformAssertions();
否则您将收到一条警告,表明测试不执行任何断言。
public function testCannotBeCreatedFromInvalidEmailAddress(): void
{
$this->expectNotToPerformAssertions();
Email::fromString('invalid'); // If this throws an exception, the test will fail.
}
与接受的答案所述相反,如果抛出未捕获的异常或错误,您的测试不会失败,而是会出错。
错误和失败在含义和功能上都是不同的。
测试失败意味着您的应用程序代码未按您希望的方式运行,例如不符合您的项目要求。
错误意味着您的代码出现意外错误。这可能是您的应用程序代码、您的配置,或者您的测试有问题。
虽然你可以依靠错误来测试你的代码,但这就是断言(和测试失败)的首要用途,对我来说似乎是不好的做法。不仅错误与测试失败的分类不同,PHPUnit 的返回码也不同:
1
表示测试失败,2
表示测试期间的错误。