RSpec:否定自定义匹配器中的强制错误

时间:2017-02-11 13:49:04

标签: ruby-on-rails ruby rspec

我有一个自定义匹配器,其中包含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失败,无论呼叫是否被否定?

1 个答案:

答案 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语句已弃用。