首页 > 解决方案 > 如何在 Slim 2 和 PHPUnit 中测试重定向?

问题描述

我正在使用 Slim 2 和 PHPUnit,并且想测试GET向特定端点发出请求会导致重定向。我已经尝试获取响应的标题,但它们显示了一个,200因为响应是我被重定向到的正确加载的页面。

以下是重定向在应用程序中的工作方式。基本上,如果 Slim Auth 中间件抛出未经授权的异常,它会重定向到登录页面:

$app->error(function (\Exception $e) use ($app) {
    if ($e instanceof HttpUnauthorizedException) {
        return $app->redirectTo('/login');
    }
});

标签: phpredirecttestingphpunitslim

解决方案


如果您提供的代码是您想要测试的全部,我认为您不一定需要检查实际的响应对象。编写一个测试来验证您编写的错误处理函数是否redirectTo('/login')$app对象调用时和实例HttpUnauthorizedException作为输入参数就足够了。错误处理函数是您在此代码片段中编写的唯一单元,其他部分(如对象中errorredirectTo方法$app)仅在您的代码中调用,您不需要为它们编写任何测试,这就是为什么我建议不要检查实际的响应对象,因为在这种情况下,您会以某种方式将错误处理功能的测试代码redirectTo与 Slim 框架的方法紧密耦合,这不是单元测试了。

所以我建议你不要把错误处理函数写成匿名函数,这样你就可以为那个特定的函数编写单元测试。然后你可以为它编写测试,并使用像Mockery这样的库来为这个函数提供一个$app模拟对象,并在 Mockeyr 的帮助下(像旧方法shouldRecieve或新allows方法),你可以确保redirectTo('/login')在该模拟对象上调用它,如果一个实例HttpUnauthorizedException传递给它。

此外,这个问题似乎与Slim Framework 端点单元测试相关


推荐阅读