php - 如何在 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');
}
});
解决方案
如果您提供的代码是您想要测试的全部,我认为您不一定需要检查实际的响应对象。编写一个测试来验证您编写的错误处理函数是否redirectTo('/login')
从$app
对象调用时和实例HttpUnauthorizedException
作为输入参数就足够了。错误处理函数是您在此代码片段中编写的唯一单元,其他部分(如对象中error
的redirectTo
方法$app
)仅在您的代码中调用,您不需要为它们编写任何测试,这就是为什么我建议不要检查实际的响应对象,因为在这种情况下,您会以某种方式将错误处理功能的测试代码redirectTo
与 Slim 框架的方法紧密耦合,这不是单元测试了。
所以我建议你不要把错误处理函数写成匿名函数,这样你就可以为那个特定的函数编写单元测试。然后你可以为它编写测试,并使用像Mockery这样的库来为这个函数提供一个$app
模拟对象,并在 Mockeyr 的帮助下(像旧方法shouldRecieve
或新allows
方法),你可以确保redirectTo('/login')
在该模拟对象上调用它,如果一个实例HttpUnauthorizedException
传递给它。
此外,这个问题似乎与Slim Framework 端点单元测试相关
推荐阅读
- c# - Unity 的 Mesh.CombineMeshes() 似乎删除了顶点信息
- javascript - Puppeteer 未定义符号
- gradle - 从 gradle 运行时,如何将 jvm 参数传递给 Jooq 代码生成器?
- python - 如何在python中具有完整段落的列的多行上使用日期查找器
- r - 如何将字符串公式传递给 R 的 lm 并在摘要中查看公式?
- three.js - 使用 applyMatrix 后的模型位置和旋转 - ThreeJS
- c# - 如何在 C# 中拆分选项卡?
- mysql - 在大型结果集上提高 mysql 中的 group by 性能
- java - 使用 Executor 删除 firebase 中的集合
- java - 在 Java 中解析 JSON 时找不到 JSONObject["sum"]