我正在使用Pundit在我的Rails应用程序上进行授权,并且正在对我的请求进行单元测试。我已经成功测试了该策略,但是现在我想验证我的请求正在使用该策略。我想以一种通用的方式做到这一点,以便可以在任何请求规范中使用(无论控制器,操作和策略如何)。老实说,在这一点上,我将遵循一种对所有请求通用的“期望任何策略接受授权”的方式。
对于索引操作(使用策略范围),这很容易:
在请求中描述我说
RSpec.describe 'GET /companies', type: :request do
include_context 'invokes policy scope'
end
然后我将共享上下文定义为:
RSpec.shared_context 'invokes policy scope', shared_context: :metadata do
before do
expect(Pundit).to receive(:policy_scope!) do |user_context, relation|
expect(user_context.user).to eq(user)
expect(user_context.current_group).to eq(group)
relation
end
end
end
但是我如何对authorize方法执行相同的操作。我不知道哪个具体策略将是接收该策略的人,也不是哪个具体控制器将调用authorize
。
我不知道pundit如何不提供自定义匹配器来验证某个请求实际上是在调用给定策略,还是“模拟”授权/未经授权的方案,因此我测试我的请求是否返回正确的状态代码。
有什么想法吗?
首先,您需要单独测试pundit
策略。第二,要传递pundit
策略,可以对满足pundit
策略的对象进行存根]
所以,我有几点评论...