如何创建一个规范以验证 Pundit 拒绝未登录的用户?

3

我在我的封闭系统Ruby on Rails应用程序中(使用Rails 4.1.5和Rspec 3.0),使用Pundit宝石进行授权。

我已经配置了我的应用策略,当用户未按照Pundit文档中的建议定义时,会引发异常:

class ApplicationPolicy
  attr_reader :user, :record

  def initialize(user, record)
    raise Pundit::NotAuthorizedError, "must be logged in" unless user
    @user = user
    @record = record
  end
end

我该如何编写一个规范以验证每个 Pundit 策略是否拒绝空用户?
我尝试了以下内容:
RSpec.describe PostPolicy do
  it "should raise an exception when users aren't logged in" do
    expect(AccountFolderPolicy.new(nil, record)).to  raise_error(Pundit::NotAuthorizedError)
  end
end

但是它报错了。
 Failure/Error: expect(PostPolicy.new(nil, record)).to raise_error(Pundit::NotAuthorizedError)
 Pundit::NotAuthorizedError:
   must be logged in

有没有关于如何正确测试这个的建议?

2
期望错误应该使用 lambda 或块 expect { ... }.to raise_error,而不是 expect( ... ).to raise_error() - Roman Kiselenko
1个回答

5
RSpec无法在后台捕获错误,除非您使用expect的块形式与raise_error匹配器:(请点击此处)
RSpec.describe PostPolicy do
  it "should raise an exception when users aren't logged in" do
    expect do
      AccountFolderPolicy.new(nil, record)
    end.to  raise_error(Pundit::NotAuthorizedError)
  end
end

或者,另一种选择是

RSpec.describe PostPolicy do
  it "should raise an exception when users aren't logged in" do
    expect { AccountFolderPolicy.new(nil, record) }.to  raise_error(Pundit::NotAuthorizedError)
  end
end

1
正如我在评论中所说的那样。加1分给你。 - Roman Kiselenko
对不起,我甚至没有看到你的评论! - Patrick Oscity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接