Rails中授权的功能测试

Ale*_*ner 5 ruby testing authorization ruby-on-rails functional-testing

我知道如何在Rails中运行功能/集成测试,这个问题是关于最佳实践的.假设使用四个不同的用户角色执行授权:

  • 基本
  • 编辑
  • 管理

这意味着对于每个动作,最多可以有五种不同的行为(4个角色+未经认证/匿名).我采取的一种方法是测试每个操作的每个角色,例如:

  • test_edit_by_anonymous_user
  • test_edit_by_basic_user
  • test_edit_by_editor_user
  • test_edit_by_admin_user
  • test_edit_by_super_user

但这显然会导致很多测试(网站上的每个控制器操作都需要进行五次测试).相反的方法是单独测试授权机制,然后在测试每个操作(在安装时)之前进行身份验证,并且只测试每个页面的一个版本.

我已经尝试了几种具有不同程度特异性的方法,但对任何事情都没有完全满意.当我测试更多案例时,我感觉更舒服,但是测试代码的数量和抽象的难度一直是关闭的.有没有人能够解决这个问题,他们对此感到满意?

sco*_*ttd 5

这实际上取决于您如何设置用于检查授权的代码以及如何在操作中测试它。我可以举个例子告诉你我们是做什么的。我们有像您一样的角色,有些页面需要登录,有些页面需要角色,有些页面根据角色有不同的输出。我们对每种类型的测试都略有不同。

首先我们分别测试授权和登录。

此外,我们还为需要用户登录的操作创建了过滤器,然后为需要特定角色的其他操作创建了过滤器。例如check_admincheck_account_owner等。然后我们可以测试这些过滤器是否独立工作。

然后,我们在控制器测试中添加检查,以确保调用了正确的过滤器。我们使用 shoulda 并编写了一些简单的扩展,以便我们可以添加检查,例如:

should_filter_before_with :check_admin, :new
Run Code Online (Sandbox Code Playgroud)

这样我们就可以测试需要测试的内容,而不是更多。

现在,对于根据角色执行不同逻辑的更复杂的操作,我们确实为包含特殊逻辑的每个角色测试这些操作。我们不会为将被过滤的操作的角色编写测试,或者为其他角色的超集编写测试。例如,如果您是管理员,该操作会向表单添加更多字段,我们会测试非管理员和管理员。我们不测试管理员和超级管理员,因为我们的角色检查代码知道超级管理员就是管理员。

此外,对于包含仅显示某些角色的某些项目的逻辑的模板,我们尝试将该代码移动到帮助程序中,或者如果像管理工具栏一样常见,则将其移动到部分代码中。然后我们可以单独测试它们,而不是对包含它们的每个操作进行测试。

总而言之,仅测试给定操作所需的内容。就像您不会在单元测试中测试 Rails 内部结构一样,如果您为角色检查编写通用代码并对其进行测试,则无需在每个操作中再次测试它。