- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的 Rails 应用程序上使用 Pundit 进行授权,我正在对我的请求进行单元测试。
我已经成功测试了该策略,但现在我想验证我的请求是否使用了该策略。
我想以一种通用的方式来做,我可以在任何请求规范中使用它(无论 Controller 、操作和策略如何)。
老实说,在这一点上,我会同意一种说法,即“期望获得授权的任何策略”,适用于所有请求。
对于索引操作(使用策略范围)很容易:
在请求中描述我说
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
的具体 Controller 是哪个。 .
最佳答案
所以,我有一些评论......
期望( expect
语句)应该在示例( it
)块内,而不是在 before
内堵塞。 before
中的那种东西块是允许语句(例如, allow(ClassX).to receive(:method) { object }
)、无法在测试变量声明中完成的数据修改或请求触发器。见 http://www.betterspecs.org/对于一些例子。 TL;DR,共享上下文不是一种适当的测试方式。
测试使用特定参数调用 policy_scope 的方法是:
# You can put something generic like this in a shared context and then
# define 'params' and 'scoped_result' as let vars in the specs that include
# the shared context
let(:request) { get '/companies' }
let(:params) { user_context or whatever }
let(:scoped_result) { relation }
# By using abstract variable names here, we make this reusable
it 'calls policy scope' do
expect(Pundit).to receive(:policy_scope!).with(params)
request
end
it 'scopes result' do
expect(Pundit.policy_scope!(params)).to eq(scoped_result)
end
before do
# This ensures Pundit.policy_scope!(context) always returns scoped_result
allow(Pundit).to receive(:policy_scope!).with(context) { scoped_result }
end
# Shared context stuff
let(:json) { JSON.parse(response.body) }
let(:headers) { ...define the headers to use across requests...}
before { request }
shared_examples_for 'success' do
it { expect(response).to have_http_status(:success) }
it { expect(json).to eq(expected) } # or something
end
# User spec that includes shared context
include_context 'above stuff'
let(:request) { get '/companies', params: params, headers: headers }
let(:params) { { user_id: user.id } } # or something
let!(:admin_thing) {
...something that should be excluded by the pundit policy used by endpoint...
}
context 'restricted' do
let!(:user) { create :user, :restricted }
let(:expected) { ...stuff scoped to restricted user... }
it_behaves_like 'success'
end
context 'manager' do
let!(:user) { create :user, :manager }
let(:expected) { ...stuff scoped to manager user... }
it_behaves_like 'success'
end
context 'superuser' do
let!(:user) { create :user, :superuser }
let(expected) { ...unscoped stuff visible to super user... }
it_behaves_like 'success'
end
关于ruby-on-rails - 有没有办法在请求规范中模拟 Pundit 政策授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59758888/
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我需要准备一个关于 iOS 移动设备管理的演示文稿。我被要求包括已实现的政策并选择其中一项并详细描述。问题是,我不知道存在哪些不同的政策。请帮帮我。 最佳答案 这里是您需要了解的有关 MDM 和 MD
我正在尝试使用 ThreadPoolExecutor 来安排任务,但在其策略方面遇到了一些问题。这是其声明的行为: 如果运行的线程少于 corePoolSize,执行器总是倾向于添加新线程而不是排队。
这是默认 Adsense 代码的示例, (adsbygoogle = window.adsbygoogle || []).push({}); 缩小后, “双引号”从代码中剥离。 (ad
假设我有一个模型用户,它可以有多个房子。这些房子可以有多个 parking 位,然后可以有多个汽车或自行车 用户 > 房屋 > parking 位 > [汽车、自行车] 如何检查汽车是否与用户相关?
我有一个管理 iOS 设备的 mdm 服务器。我们已经完成了在设备上安装 mdm 配置文件的所有步骤。此外,我们还应用了适用于设备和 Wi-Fi 等配置的所有政策。 问题 1: 当我们发送“allow
请问如何使用 C# 编辑 gpedit.msc 策略? 最佳答案 gpedit.msc 只是注册表设置的一个接口(interface); gpedit 没有 API 或暴露的框架。要像 gpedit
当我尝试运行我的网站时,它显示 500 internal server error : Internal Server Error The server encountered an internal
在 Play 商店中发布新内容时,它会在下面询问 如果您的应用的某些部分因登录凭据、成员(member)资格、位置或其他形式的身份验证而受到限制,请提供详细信息,以便 Google 审核您的应用 -
我在我应用的admin部分中使用pundit进行访问控制。我有一个仪表板 Controller ,如下所示: class Admin::DashboardsController < AdminCont
我写了一个 Chrome 扩展,它使用本地存储。 当我打开 chrome://policy/在浏览器中,我可以根据其 ID 查看我的扩展程序的数据,但是,当我在注册表中手动更改该值时,它不会自动更新。
当在 Cassandra 中使用 token 感知策略作为负载平衡策略时,所有查询都会自动通过正确的节点发送(其中包含副本,例如 select * from Table wherepartionkey
我想在同一事件中同时展示横幅广告和插页式广告。但我不确定这是否会违反 Google admob 政策,因为当显示插页式广告时,它会覆盖横幅广告。 谢谢。 最佳答案 这是允许的。事实上,建议您这样做以增
您好,我想知道是否通过设置 User Interface Style 来强制我的应用程序进入灯光模式至Light在 plist 中可能会导致我的应用程序被拒绝?? 最佳答案 Official Docu
我想在同一事件中同时展示横幅广告和插页式广告。但我不确定这是否会违反 Google admob 政策,因为当显示插页式广告时,它会覆盖横幅广告。 谢谢。 最佳答案 这是允许的。事实上,建议您这样做以增
我在我的应用程序中使用 Navigation-Drawer。所以我用 navigation_drawer 布局创建了单个 Activity 。每当用户从抽屉导航菜单中选择菜单选项时,我都会使用 fra
我在弄清楚 sails 政策时遇到困难,我按照教程进行操作,但仍然无法使其工作。 在我的policies.js 文件中: module.exports.policies = { '*':true,
我开始收到很多类似这样的 sails 政策: ... 'MyController':{ 'some': ['runPassport', 'isLoggedIn', 'ensureTotpOkI
如何在 htmlunit 中指定 cookie 策略以接受所有 cookie? 最佳答案 只需重新创建整个 CookieManager 类:这是类(class)的来源:http://jarvana.c
我是一名优秀的程序员,十分优秀!