ruby-on-rails - 权威规范测试中的 Rubocop RSpec/MultipleMemoizedHelpers 问题
问题描述
我使用 pundit 进行授权,使用 RSpec 在我的 rails 应用程序中进行测试。因此,我不得不为策略创建规范。
但是,我遇到了 rubocop 抛出错误的问题:RSpec/MultipleMemoizedHelpers。我明白这意味着我有太多let
的subject
电话。我的问题是我不太确定如何解决或重构我的代码,以使其符合我应该进行的正确调用次数。
另一件事,可以为规范文件禁用 RSpec/MultipleMemoizedHelpers 吗?
以下是三个存在问题的策略规范文件。
require "rails_helper"
describe AnswerPolicy do
subject { described_class }
let(:user_admin) { build(:user, :admin) }
let(:consultant) { build(:consultant) }
let(:user_consultant) { build(:user, :consultant, consultant: consultant) }
let(:client) { build(:client, consultant: consultant) }
let(:user_client) { build(:user, :client, client: client) }
let(:other_client) { build(:client, consultant: build(:consultant)) }
let(:answer) { build(:answer, client: client) }
let(:other_answer) { build(:answer, client: other_client) }
permissions :update? do
it "allows access to admin" do
expect(described_class).to permit(user_admin)
end
it "prevents consultants to update other non-client answers" do
expect(described_class).not_to permit(user_consultant, other_answer)
end
it "prevents clients to update their answers" do
expect(described_class).not_to permit(user_client, answer)
end
it "allows consultants to update their client's answers" do
expect(described_class).to permit(user_consultant, answer)
end
end
end
describe AssessmentStepPolicy do
subject { described_class }
let(:user_admin) { build(:user, :admin) }
let(:consultant) { build(:consultant) }
let(:user_consultant) { build(:user, :consultant, consultant: consultant) }
let(:client) { build(:client, consultant: consultant) }
let(:user_client) { build(:user, :client, client: client) }
let(:other_client) { build(:client, consultant: build(:consultant)) }
permissions :view? do
it "allows access to admin" do
expect(described_class).to permit(user_admin)
end
it "prevents consultants to view other non-client assessment details" do
expect(described_class).not_to permit(user_consultant, other_client)
end
it "allows clients to view their assessment details" do
expect(described_class).to permit(user_client, client)
end
it "prevents clients to view other client's assessment details" do
expect(described_class).not_to permit(user_client, other_client)
end
it "allows consultants to view their client's answers" do
expect(described_class).to permit(user_consultant, client)
end
end
permissions :create? do
it "allows access to any admin" do
expect(described_class).to permit(user_admin)
end
it "prevents consultants to assess other clients" do
expect(described_class).not_to permit(user_consultant, other_client)
end
it "prevents clients to assess themselves" do
expect(described_class).not_to permit(user_client, client)
end
it "allows consultants to assess their clients" do
expect(described_class).to permit(user_consultant, client)
end
end
end
require "rails_helper"
describe ReportPolicy do
subject { described_class }
let(:user_admin) { build(:user, :admin) }
let(:consultant) { build(:consultant) }
let(:user_consultant) { build(:user, :consultant, consultant: consultant) }
let(:client) { build(:client, consultant: consultant) }
let(:user_client) { build(:user, :client, client: client) }
let(:other_consultant) { build(:consultant) }
let(:other_client) { build(:client, consultant: other_consultant) }
permissions :dashboard? do
it "allows access to admin" do
expect(described_class).to permit(user_admin)
end
it "prevents clients to view other client dashboards" do
expect(described_class).not_to permit(user_client, other_client)
end
it "prevents consultants to view other non-client dashboards" do
expect(described_class).not_to permit(user_consultant, other_client)
end
it "allows clients to view their dashboard" do
expect(described_class).to permit(user_client, client)
end
it "allows consultants to view their client's dashboards" do
expect(described_class).to permit(user_consultant, client)
end
end
end
解决方案
这个RSpec/MultipleMemoizedHelpers
警察是有争议的。它希望您将数量限制为let
任意数量。
我与它进行了艰苦的斗争。对我来说,这类似于一个警察,因为你有太多变数,所以会冒犯。rubocop
并rubocop-ast
禁用它,而我们通常会启用比默认值更多的警察。请注意,您可以将这些更改let
为def
并且攻击消失(尽管您没有更改任何内容;let
只是 a 的语法糖def
)。
共享你的工厂似乎是个好主意,我建议也禁用警察。
推荐阅读
- c++ - How to have one pthread continue while another thread is waiting on a semaphore in C++?
- selenium-webdriver - org.openqa.selenium.interactions.MoveTargetOutOfBoundsException:无法点击元素
- javascript - 日期选择器未设置最大值和最小值
- ios - 如何在 UIScrollView 中分页时一次仅加载一个 ViewController
- python - 正则表达式匹配与 Python 中的回车符
- azure-cosmosdb - 如何删除 Azure Cosmos DB 视图中的列?
- python - Is there a way to quickly get rid of a lot of excess data with regex searches?
- logstash - 即使文件没有更改,也重新加载logstash配置文件
- android - 带有 EditText 的自定义 ListView 的问题
- javascript - three.js animations are frozen