【发布时间】:2017-11-03 01:49:49
【问题描述】:
我想用 RSpec 彻底测试 Rails 应用程序授权设置 (Pundit)。
Pundit docs 和 other respectful sources 建议为 Pundit 策略类编写单元测试。这些测试是测试行为(好)还是测试实现细节(坏)?
如果我们实际上是在测试行为,如果我们最终从 Pundit 切换到另一个授权 gem 或滚动我们自己的授权,我们的测试难道不应该通过吗?
假设对
authorize方法的调用意外地从控制器操作中删除,使其开放供公众访问。 Pundit 政策测试将继续通过。如果我们没有其他测试涵盖这一点,我们的测试套件可能全是绿色的,而我们的应用程序存在严重的安全漏洞。我们怎样才能避免这种情况?也许为 Pundit 控制器类编写单元测试,为控制器单独单元测试并在控制器测试中模拟authorize方法以确保它们被调用?
编辑:再想一想,我对类的实现细节和公共 API 之间的区别有一个判断失误。调用特定的公共方法、传递特定的参数并期望特定的返回值是对任何类进行单元测试(和使用)的要求。请忽略第 3 项 我原来的论点是无效的。
- 代替测试 Pundit 策略类,我们可以编写控制器或请求规范,以不同的用户角色登录,调用控制器操作并断言是授予还是拒绝访问。在这种方法中,即使我们切换到另一个授权 gem,测试也会继续通过。此外,如果不调用
authorize方法,它们也会失败。但是,这些将是集成测试,并且应该比单元测试 Pundit 策略类慢。这是否是测试授权设置的更好方法?
提前致谢。
【问题讨论】:
标签: ruby-on-rails testing rspec tdd pundit