我有一个自定义匹配器,其中包含expect
:
RSpec::Matchers.define :have_access_to do |action|
match do |user|
allow(controller).to receive(:authorize!)
# perform GET request...
expect(controller).to have_received(:authorize!)
response.code == "200"
end
end
这是有效的,只要我这样称呼
it { expect(shop_manager).to have_access_to(:index) }
但是当我尝试使用否定形式not_to
,并且客户匹配器中的expect
失败时,测试通过:
it { expect(shop_manager).not_to have_access_to(:index) }
我在这里理解RSpec逻辑:当您希望测试失败并且not_to
失败并且失败时,一切都很好。
但是这个expect
是一个辅助条件:我想检查整个请求是否已通过authorize!
步骤。
我知道匹配器应该只测试一件事,但是我经常使用它,当我在每次测试中添加have_received(:authorize!)
检查时会导致大量的代码重复。
有没有办法强制RSpec失败,无论呼叫是否被否定?
答案 0 :(得分:1)
你可以做到
RSpec::Matchers.define :have_access_to do |action|
match do |user|
allow(controller).to receive(:authorize!)
# perform GET request...
fail "failed to receive authorize" unless controller.received_message?(:authorize!)
response.code == "200"
end
end
使用旧的rspec shoulda语法。但是,我收到了这个
的弃用警告使用来自rspec-mocks的
received_message?
'不建议使用语法的旧:should
语句已弃用。