在 Pest 中有条件地断言抛出异常
发布于 作者 Paul Redmond
Pest 最近在 Pest v2.24 中添加了 throwsUnless()
方法,用于在给定的布尔表达式计算结果为假时有条件地验证异常。
此方法是 throwIf()
方法的对应方法,后者在给定的表达式为真时有条件地验证异常。
test('example 1', function () { // Test that only throws an exception for the mysql driver...})->throwsIf(DB::getDriverName() === 'mysql', Exception::class, 'MySQL is not supported.'); test('example 2', function () { // Test that throws unless the db driver is mysql...})->throwsUnless(DB::getDriverName() === 'mysql', SomeDBException::class);
例如,假设您有一个支持各种用于处理图像的 PHP 扩展的 PHP 包。您的 CI 环境可能支持并测试 gd
和 imagemagick
;但是,其他环境可能只支持其中一个。
test('gd wrapper can create an image', function () { $image = imagecreate(width: 200, height: 200); imagecolorallocate($image, 255, 255, 255); imagepng($image, '/tmp/new_image_gd.png'); expect(file_exists('/tmp/new_image_gd.png'))->toBeTrue();})->throwsUnless(extension_loaded('gd'), \Error::class); test('imagemagic wrapper can create an image', function () { $image = new Imagick(); // ... })->throwsUnless(extension_loaded('imagick'), \Error::class);
throwsIf()
和 throwsUnless()
方法还支持可调用函数,如果您更喜欢这种方式或有一些自定义逻辑要用于确定测试是否应该抛出异常。
test('example test with callables', function () { $image = new Imagick(); // ...})->throwsUnless(fn () => class_exists(\Imagick::class), 'Class "Imagick" not found');
了解更多
您可以在 Pest 异常文档 中了解有关在测试中处理异常的信息。另外,如果您是 PestPHP 新手,更喜欢视频,我们建议您查看由 Luke Downing 制作的 从头开始学习 PestPHP。