取反 RSpec 中的参数匹配器 3

Negate argument matcher in RSpec 3

我正在调用一个函数,我需要测试它的参数。通常我会做类似的事情:

expect(my_obj).to_receive(:my_function).with(include('good_value'))

有没有办法把它翻转过来,变成像

expect(my_obj).to_receive(:my_function).with(exclude('bad_value'))

在关于 return 值的规范中,这可以使用 to_not 简单地完成,但是当匹配参数时,这种否定形式似乎不可用。除了编写自定义匹配器之外,我在文档中找不到任何建议执行此操作的方法,这在这里感觉有点矫枉过正。

有没有一种无需编写自定义匹配器即可执行此操作的简单方法?

你可以试试:

http://www.rubydoc.info/gems/rspec-mocks/RSpec/Mocks/ArgumentMatchers#hash_excluding-instance_method

expect(object).to receive(:message).with(hash_excluding(:key => val))

RSpec 3.1+ 允许您使用 RSpec::Matchers.define_negated_matcher:

定义任何匹配器的否定版本
RSpec::Matchers.define_negated_matcher :exclude, :include

完成后,这应该可以工作:

expect(my_obj).to_receive(:my_function).with(exclude('bad_value'))