在RSpec 3中否定参数匹配器

时间:2015-07-27 22:05:23

标签: ruby rspec rspec3

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

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

有没有办法翻转这个,就像是

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

在返回值的规范中,这只是使用to_not完成,但是当匹配参数时,这种形式的否定是不可用的。除了编写自定义匹配器之外,我在文档中找不到任何建议方法来做这些事情,这在这里感觉有些过分。

有没有一种简单的方法可以做到这一点而无需编写自定义匹配器?

2 个答案:

答案 0 :(得分:2)

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'))

答案 1 :(得分:1)

您可以尝试:

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

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