鉴于一个非平凡的Rails应用程序,只有经过身份验证的用户才能访问大量的控制器和路由,即使这样,只有具有授权的用户才能测试未经身份验证的用户和未授权用户的最明智的方法是什么?
目前,我通常会通过功能测试经过身份验证的用户流,然后回退到控制器测试,以测试未经授权或未经身份验证的用户无法访问这些路由。
显然,确保未经身份验证的用户获得401很容易进行测试,但测试授权是另一回事。对访问权限进行粒度测试是有意义的 - 我想知道我做过的事情是否无意中给了客户破坏用户的能力 - 但是为每个根据气球添加了大量测试的测试。
我该如何处理?
答案 0 :(得分:1)
这取决于您如何进行授权。您只需编写与编写授权代码块一样多的测试。
如果您编写特定代码来检查每个地方使用资源的授权,那么除了为每个检查编写测试(可能是控制器规范)之外别无选择。我还编写了一个Cucumber场景来指定用户在授权被拒绝时看到的内容以及集成测试整个堆栈。
如果您将授权转移到框架中,无论是Cancan还是您自己的框架,只需要每个控制器在一个地方调用框架(例如CanCan' s load_and_authorize_resource
),那么您只需要为每个控制器编写一个规范(一个显示一些经过身份验证但未经授权的用户无法访问资源)以确定正在调用授权框架。如果框架将授权逻辑移动到一组新的类(例如CanCan::Ability
子类),那么您需要对这些类进行单元测试,但是您可能能够使用每个类。不止一个地方,因此他们需要的测试数量不会增加,并且他们的测试将比控制器规格更简单。
同样,如果您的授权框架完全由配置驱动,并且您只需在应用程序的一个位置调用它,那么您只需编写一个Cucumber方案。
您可能会想到不同的架构会导致不同的测试要求,但我认为这些示例显示了一般的想法。