我有一个非常简单的 Pundit 策略,适用于不同的用户角色。我不知道如何在 Rspec 中测试它。具体来说,我不知道如何在访问范围之前告诉范围哪些用户登录。
这是我尝试过的:
let(:records) { policy_scope(Report) }
context 'admin user' do
before(:each) { sign_in(admin_user) }
it { expect(reports.to_a).to match_array([account1_report, account2_report]) }
end
context 'client user' do
before(:each) { sign_in(account2_user) }
it { expect(reports.to_a).to match_array([account2_report]) }
end
Run Code Online (Sandbox Code Playgroud)
当我运行 Rspec 时,我得到:
NoMethodError: undefined method `sign_in' for #<RSpec::ExampleGroups::ReportPolicy::Scope:0x00007f93241c67b8>
Run Code Online (Sandbox Code Playgroud)
我sign_in在控制器测试中广泛使用,但我想这不适用于策略测试。
Pundit 文档只说:
Pundit 不提供用于测试范围的 DSL。只需像常规 Ruby 类一样对其进行测试即可!
那么...是否有人有针对特定用户测试 Pundit 范围的示例?我如何告诉范围 current_user 是什么?
FWIW,这是我政策的精髓:
class ReportPolicy < ApplicationPolicy
def index?
true
end
class Scope < Scope
def resolve
if user.role …Run Code Online (Sandbox Code Playgroud) 今天,我无法运行rspec过去一年中每天多次测试的项目。
它打印前几行启动行(弃用警告等),然后挂起。几分钟过去了,没有任何额外的输出。Ctrl-C 成功杀死它并显示正常RSpec is shutting down and will print the summary report... Interrupt again to force quit.消息。
我尝试隐藏我的更改,并更改为主分支,但问题没有改变。我计算机上的其他项目继续运行 rspec,没有出现问题。
我需要生成类似于“ABC1”和“XYZ9”的标签序列——始终是三个字母后跟一个数字。我希望标签的两个部分都能逻辑递增,并且始终保持准确的格式和长度。
我开始于:
sequence(:code) { |n| "ABC#{n}" }
Run Code Online (Sandbox Code Playgroud)
这很好,但在第九个标签 ( ABC9) 之后,它转到 ( ABC10),违反了我的格式,并且只生成 10 个(或 9 个?)值。
使用字母序列和硬编码一位数字的快速修复可以使我的翻转问题不会发生26^3 => 17,576,这可能没问题。但是,我真的希望数字也有一些变化。随机数字可能就足够了......但我想要所有可用的值。
我考虑了一些有点笨拙的方法,从一两个序列构建字符串,以获得始终与格式匹配的综合值,但它们看起来很笨拙。
FactoryBot 中是否有一种优雅的方法来构建一个排序字符串,其中包含固定宽度的字母段,后跟固定宽度的数字段,以生成所有可能的值?
我正在尝试测试我的多态关联,但我似乎无法让它通过
模型:
class Foo < ApplicationRecord
belongs_to :bar, polymorphic: true, optional: true
end
Run Code Online (Sandbox Code Playgroud)
现在我的测试看起来像
RSpec.describe Foo, type: :model do
subject { build(:foo) }
it { is_expected.to belong_to(:bar) }
end
Run Code Online (Sandbox Code Playgroud)
我收到的错误
Foo
is expected to belong to bar required: true (FAILED - 1)
Failures:
> 1) Foo is expected to belong to bar required: true
> Failure/Error: it { is_expected.to belong_to(:bar) }
> Expected Foo to have a belongs_to association called bar (and for the record to fail validation if :bar …Run Code Online (Sandbox Code Playgroud) 我继承了一个从多个表中提取的大型复杂 Arel 查询。一个新的要求是,如果这些表中的一个没有特定字段(“地区”)的值,我应该将其默认为“全局”。
由于查询构建和视图中的高度抽象,我没有什么好方法可以在查询之前或之后插入该默认值。因此,如果字段为零或没有匹配的行,我需要在 Arel 查询中的字段中插入一个默认值。
如何在 Arel 查询中将字段默认为字符串值?
我想在我的 rspec 测试中使用 stub_reuest模拟对给定站点的所有请求......不仅仅是我今天知道的 URL。特别是,我想引发异常或超时来模拟 REST 服务脱机或损坏。
如何只匹配一个站点的所有 URL?如何阻止给定主机的任何 URL?
add_foreign_key 可以向 ALTER TABLE 命令添加“无效”参数吗?(Postgres,如果重要的话)
我在两个非常大的表之间有一个外键。我需要将 CASCADE DELETE 添加到密钥中。Postgres 似乎不支持将级联添加到现有的外键。解决方案是删除密钥,并使用级联添加新密钥。
很简单……除了检查约束需要很长时间。我不确定在该检查期间是否会发生任何锁定,但实际上,我只想跳过它。在我删除约束之前,数据是有效的……它稍后会有效。
Postgres 通过ALTER TABLE ADD CONSTRAINT ... NOT VALID. (这意味着“跳过验证”,即使听起来您说它无效。:耸肩:)
那么,我可以让 add_foreign_key 不进行验证吗?
rspec ×4
ruby ×4
activerecord ×2
arel ×1
coalesce ×1
default ×1
digits ×1
factory-bot ×1
foreign-keys ×1
mocking ×1
pundit ×1
regex ×1
sequence ×1