【问题标题】:rspec: 'should_receive' with multiple argument expectationsrspec:具有多个参数期望的“should_receive”
【发布时间】:2013-07-11 10:30:53
【问题描述】:

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

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

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

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

谢谢

编辑:

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

【问题讨论】:

    标签: ruby testing rspec integration-testing


    【解决方案1】:

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

    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 部分

    【讨论】:

      【解决方案2】:

      您需要提供自定义匹配器,但您可以轻松定义错误报告,以便详细说明失败的原因和原因。见https://github.com/dchelimsky/rspec/wiki/Custom-Matchers

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

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

      【讨论】:

      • 第二个链接看起来很有用。我看过第一个,它没有提供关于复杂匹配器的太多细节。明天我会玩,看看我能不能想出一个明智的匹配器。
      • +1 表示相关,但它并不能完全回答问题。 “with”的行为与“should”有点不同。 should 的自定义匹配器将报告它不匹配的原因。然而,'with' 似乎要等到它收到一个匹配的参数。如果不匹配,rspec 只报告不匹配的参数是什么。 IE。似乎没有办法为“with”定义自定义失败消息。不过,我很高兴被证明是错误的!
      • 我同意有区别。我更新了答案以反映自定义匹配器将出现的位置(即作为标准 with 方法的参数),但这仍然留下了错误消息的问题。虽然这是一个 hack,但您可以修改自定义匹配器的 description 方法以输出您想要的有关失败匹配的任何信息。当with 报告失败时,此方法是在“预期:”之后使用的。由于 rspec 代码中没有定义failure_message_for_with,我怀疑这可能是您拥有的唯一“钩子”。
      • 谢谢,这更清楚了。描述可能会改善错误消息,它可能已经足够好了。
      • 我找到了生成错误消息的 rspec 代码,并确认没有其他可用的钩子。请参阅github.com/rspec/rspec-mocks/blob/… 中的raise_unexpected_message_args_error 尽管有重复自己的风险,自定义匹配器的description 方法可以通过访问匹配器代码存储的实例变量信息来输出您想要的有关失败匹配的任何信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      相关资源
      最近更新 更多