如何用PHPUnit批量测试路由的AuthenticationException?循环终止问题
解决PHPUnit循环测试路由时异常终止的问题
这个问题我之前也碰到过!核心原因是PHPUnit的expectException是绑定到整个测试方法的,一旦异常被抛出,当前测试方法就会直接终止,没法继续执行循环里的后续路由。给你两个靠谱的解决方案:
方案一:使用PHPUnit的数据提供者(推荐)
这是PHPUnit官方推荐的处理多组测试数据的方式,每个路由会被当作独立的测试用例执行,即使某个路由测试失败,其他的依然会继续运行,而且测试报告里能清晰看到每个路由的结果。
// 定义数据提供者,返回要测试的路由列表 public function protectedRoutesProvider() { return [ ['bla/bla/bloe'], ['bla/bla/blie'], // 这里可以继续添加更多路由 ]; } // 使用@dataProvider注解关联数据提供者 /** * @dataProvider protectedRoutesProvider */ public function test_protected_routes_throw_authentication_exception(string $route) { $this->expectException(AuthenticationException::class); $this->get($route)->json(); }
简单来说,数据提供者返回的每一组数据都会触发一次测试方法的执行,相当于为每个路由单独跑了一次测试,完美避开了循环中异常终止的问题。
方案二:在循环中手动捕获异常
如果不想拆分测试方法,也可以用try-catch块手动捕获请求时的异常,然后断言是否是预期的AuthenticationException。
public function test_not_allowed_exception() { $routes = ['bla/bla/bloe', 'bla/bla/blie']; foreach ($routes as $route) { try { $this->get($route)->json(); // 如果走到这里,说明没有抛出异常,主动标记测试失败 $this->fail("Route $route did not throw AuthenticationException"); } catch (\Exception $e) { // 断言捕获到的异常是我们预期的类型 $this->assertInstanceOf(AuthenticationException::class, $e); } } }
每次循环里用try包裹请求逻辑:如果请求没有抛出异常,就调用fail()标记该路由测试失败;如果捕获到异常,就验证它是不是我们要的AuthenticationException。这样即使某个路由的测试出问题,循环依然会继续执行下一个路由。
内容的提问来源于stack exchange,提问作者Mister Verleg
相关产品推荐
相关产品推荐

