You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:48:41