rspec:'should_receive'具有多个参数期望值

时间:2013-07-11 10:30:53

标签: ruby testing rspec integration-testing

我有一个接收复杂参数(HTML字符串)的函数。我想检查一下这个字符串的多个条件,即:

receiver.should_receive(:post_data).with(json_content).with(id_matching(5))

多个with参数不起作用,还有其他选择吗?我很乐意定义自定义匹配器,如果可以以某种方式制作复合匹配器。

显然我可以多次运行相同的测试并测试结果的不同内容,但是这是一个需要几秒钟才能运行的集成测试,因此我不想让它更慢。

由于

修改

在撰写本文时,接受的答案(使用带有自定义说明的自定义匹配器)似乎是最佳选择。然而,它并不完美,理想情况下with会支持“这是预期类型的​​项目,但不是我们预期的那个”的概念,而不是纯二进制匹配。

2 个答案:

答案 0 :(得分:7)

也许你甚至不需要自定义匹配器,块形式就足够了。

receiver.should_receive(:post_data) do |*args|
  json_content = args.first
  json_content.should_not be_empty
  json_content.should include "some string"
end

请参阅RSpec Mocks文档,第Arbitrary Handling部分

答案 1 :(得分:3)

您需要提供自定义匹配器,但您可以轻松定义错误报告,以便您可以详细说明失败的原因和原因。请参阅https://github.com/dchelimsky/rspec/wiki/Custom-Matchershttp://solnic.eu/2011/01/14/custom-rspec-2-matchers.html

特别是,自定义匹配器将作为with的参数提供,如https://github.com/rspec/rspec-mocks的“参数匹配器”部分第一段的最后一句所述。

对于错误报告,没有适用于此用例的自定义失败方法,但使用自定义匹配器的description方法生成显示为“预期”值的字符串,尽管不是目的,可以定义为输出关于失败匹配的任何内容。