我调用了一个函数,需要测试它的参数。通常我会这样做:
expect(my_obj).to_receive(:my_function).with(include('good_value'))
有没有办法把它反过来,变成像
这样的东西呢?expect(my_obj).to_receive(:my_function).with(exclude('bad_value'))
在返回值的规范中,这只是使用to_not
完成的,但是在匹配参数时,这种形式的否定似乎不可用。我在文档中找不到任何建议的方法,除了编写一个自定义匹配器,在这里感觉有点小题大做。
是否有一个简单的方法,我可以做到这一点,而不必写一个自定义匹配器?
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'))
你可以试试:
http://www.rubydoc.info/gems/rspec-mocks/RSpec/Mocks/ArgumentMatchers hash_excluding-instance_method
expect(object).to receive(:message).with(hash_excluding(:key => val))