异常

在测试 PHP 中的行为时,您可能需要检查是否抛出了异常或错误。要创建一个期望抛出异常的测试,您可以使用 throws() 方法。

1it('throws exception', function () {
2 throw new Exception('Something happened.');
3})->throws(Exception::class);

如果您还想对异常消息进行断言,可以向 throws() 方法提供第二个参数。

1it('throws exception', function () {
2 throw new Exception('Something happened.');
3})->throws(Exception::class, 'Something happened.');

如果异常类型不相关,而您只关心消息,则可以只传递消息而不指定异常的类型。

1it('throws exception', function () {
2 throw new Exception('Something happened.');
3})->throws('Something happened.');

您可以使用 throwsIf() 方法在给定布尔表达式计算结果为 true 时有条件地验证异常。

1it('throws exception', function () {
2 //
3})->throwsIf(fn() => DB::getDriverName() === 'mysql', Exception::class, 'MySQL is not supported.');

就像 throwsIf() 方法一样,您可以使用 throwsUnless() 方法在给定布尔表达式计算结果为 false 时有条件地验证异常。

1it('throws exception', function () {
2 //
3})->throwsUnless(fn() => DB::getDriverName() === 'mysql', Exception::class, 'Only MySQL is supported.');

您还可以使用期望 API 的 toThrow() 方法验证给定的闭包是否抛出一个或多个异常。

1it('throws exception', function () {
2 expect(fn() => throw new Exception('Something happened.'))->toThrow(Exception::class);
3});

如果您期望不抛出任何异常,则可以使用 throwsNoExceptions() 方法。

1it('throws no exceptions', function () {
2 $result = 1 + 1;
3})->throwsNoExceptions();

有时,您可能只想将测试标记为失败。您可以使用 fail() 方法执行此操作。

1it('fail', function () {
2 $this->fail();
3});

您也可以向 fail() 方法提供消息。

1it('fail', function () {
2 $this->fail('Something went wrong.');
3});

此外,您还可以使用 fails() 方法验证测试是否失败。

1it('fails', function () {
2 throw new Exception('Something happened.');
3})->fails();

就像 fail() 方法一样,您也可以向 fails() 方法提供消息。

1it('fails', function () {
2 throw new Exception('Something happened.');
3})->fails('Something went wrong.');

在学习了如何编写断言异常的测试后,下一步是探索“测试过滤”。此功能允许您根据测试名称、脏文件等条件有效地运行特定测试:过滤测试 →