rspec:对预期方法参数的多个期望

rspec:对预期方法参数的多个期望,rspec,Rspec,是否有一种方法可以获得传递给测试主题的参数的句柄,然后对参数测试多个不同的期望?大概是这样的: expect(foo).接收(:bar) 受试者。试验中的方法 expect(args\u将\u传递给\u foo)。将为散列\u,包括(键1:“某些值”) expect(args\u传递给\u foo)。为散列\u,包括(key2:/some regexp/) expect(args\u传递给\u foo.keys)。不包含(:key3) 期望(some_方法(args_传递给_-foo[:key4

是否有一种方法可以获得传递给测试主题的参数的句柄,然后对参数测试多个不同的期望?大概是这样的:

expect(foo).接收(:bar)
受试者。试验中的方法
expect(args\u将\u传递给\u foo)。将为散列\u,包括(键1:“某些值”)
expect(args\u传递给\u foo)。为散列\u,包括(key2:/some regexp/)
expect(args\u传递给\u foo.keys)。不包含(:key3)
期望(some_方法(args_传递给_-foo[:key4]))为>some_常量
我所知道的实现上述功能的唯一方法是:

expect(foo).接收(:bar).with(
# ........
)
受试者。试验中的方法

但这并不能真正处理最复杂的情况,而且它也非常笨拙,而且您正在使用一个
expect
测试许多东西,这似乎不正确。

是的,获取传递给测试主题的参数句柄的方法是:

在做之前
允许(foo).接收(:bar)
终止
它“做某事”做什么
受试者。试验中的方法
期望(foo).将_接收(:bar)do|args_传递给_foo|
expect(args\u将\u传递给\u foo)。将为散列\u,包括(键1:“某些值”)
expect(args\u传递给\u foo)。为散列\u,包括(key2:/some regexp/)
expect(args\u传递给\u foo.keys)。不包含(:key3)
期望(some_方法(args_传递给_-foo[:key4]))为>some_常量
终止
终止

RSpec允许您在收到
期望值后通过一个块。块将产生传递给实际调用的参数。

您不只是对eq(一些期望的散列)说
的原因是什么?我个人会从这里开始,作为测试的基线,然后如果需要测试单个关键点的边缘情况,可以开始逐个测试单个关键点。我觉得做任何其他事情都会导致你写反向测试,这可能比测试多个东西更糟糕。(一个反向测试是一个散列没有的无穷多个键中的一个。)我还想说,有些人对测试“一”事物太过火了。就像我在写一个请求规范一样,运行三个测试来测试响应代码、内容类型和主体是毫无意义的,因为它们是可以测试的独立的东西。我通常选择测试“一”件事,即“响应”。当您这样测试您的一件事情时,您的测试运行得更快,并且意图有时会更清楚。归根结底,测试一件事对于可读性非常重要。如果它读起来不错,并且测试了您需要测试的场景,那就太好了!谢谢你的评论,内特。在我的特殊情况下,我正在测试作为参数发送给方法的两个大字符串的属性。我当然可以写一个庞大的Regexp,但写起来和读起来都很残酷。我宁愿有一系列的期望,非常清楚地传达测试意图。这些期望可能只是检查子字符串的存在,但它们也可能有稍微复杂的regexp匹配。我想我可以做的是让一个单独的类生成大字符串作为输出,然后我可以用rspec更简单地测试输出。我不确定任何代码看起来像什么,但是这听起来像是一个很好的方法来精简生成散列的方法。我不确定这个散列是什么,但是用它生成一个完整的类,让每个键都是一个方法,然后如果你真的需要一个散列作为输出,你可以创建一个
to_h
方法,该方法通过一个方法名数组循环以包含在输出散列中。当然,如果它实际上并不复杂,那可能是过度设计了。非常有趣。这是个好消息。不幸的是,我使用了我在上面的评论线程中描述的独立类解决方案,但是您已经分享了很好的信息。谢谢