PHPUnit - 测试是否未抛出异常?

问题描述 投票:0回答:2

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 抛出。

php phpunit
2个回答
26
投票

如果抛出未捕获或意外的异常,测试将失败。您不必做任何特殊的事情,只需运行正在测试的代码即可。如果测试方法中没有其他断言,您还必须执行

$this->expectNotToPerformAssertions();
否则您将收到一条警告,表明测试不执行任何断言。

public function testCannotBeCreatedFromInvalidEmailAddress(): void
{
    $this->expectNotToPerformAssertions();
    Email::fromString('invalid'); // If this throws an exception, the test will fail.
}

0
投票

PHPUnit 没有提供检查是否抛出异常的方法。

与接受的答案所述相反,如果抛出未捕获的异常或错误,您的测试不会失败,而是会出错。

错误和失败在含义和功能上都是不同的。

测试失败意味着您的应用程序代码未按您希望的方式运行,例如不符合您的项目要求。

错误意味着您的代码出现意外错误。这可能是您的应用程序代码、您的配置,或者您的测试有问题。

虽然你可以依靠错误来测试你的代码,但这就是断言(和测试失败)的首要用途,对我来说似乎是不好的做法。不仅错误与测试失败的分类不同,PHPUnit 的返回码也不同:

1
表示测试失败,
2
表示测试期间的错误。

© www.soinside.com 2019 - 2024. All rights reserved.