我使用cancan构建了一个相当庞大且复杂的用户权限方案,该方案是建立在一组用户访问级别上的,我打电话给“等级”#。现在有6层,我们将来可能会增加更多。每个用户层都可以访问不同的功能,在某些情况下,分支变得非常复杂。随着每个新层,复杂性呈指数级增长。
我正在使用RSpec进行测试,在某些情况下,测试已经成为一个问题,尤其是控制器/集成测试。我按照cancan wiki:https://github.com/ryanb/cancan/wiki/Testing-Abilities中的建议,对能力模型进行了单元测试,这很简单。但是,集成测试很快就会变得臃肿,我想在不完全忽视集成测试中的层和权限的情况下尽量减少膨胀。
我正在寻找能够让集成测试继续考虑基于层次的权限的模式,同时尽量减少膨胀的数量。
我的一些控制器测试开始看起来像这样:
allow(controller).to receive(:can?).with(:read, :some_feature).and_return(true)
allow(controller).to receive(:can?).with(:read, :some_other_feature).and_return(true)
allow(controller).to receive(:can?).with(:read, :yet_another_feature).and_return(false)
# ... lots of other stubs
随着我们继续添加限制功能,这会变得越来越糟。我正在考虑其他一些模式,例如为每种用户类型定义一堆工厂,并为每种类型设置每个控制器的分支测试,但我还不确定它是否会成为任何类型更好。
我想其他人一定会遇到这样的问题,我只是希望有人有一些关于如何减少我正在做的存根的创意,或者找到了他们喜欢的模式提供良好的测试覆盖率,没有那么多膨胀。只是在没有进行任何集成测试的情况下测试自己的能力对我来说不够,但也许这是最好的答案!