ScalaTest允许您编写如下代码:
result should have length 3
进行此解析的内幕是什么?它只是使用中缀表示法,即它是
result.should(have).length(3)
通过一些涉及暗示的魔法?还是有更复杂的事情发生?
答案 0 :(得分:3)
你是完全正确的:带有implicits +中缀语法的神奇。
让我们分开你的榜样。在
result should have length 3
表达式result
(通常)没有方法should
。但是,如果您混合Matchers,则会得到隐式转化convertToAnyShouldWrapper
,它会返回AnyShouldWrapper。此AnyShouldWrapper
现在有一个重载方法should
。
其中一个should
版本以HaveWord为参数,返回一个名为ResultOfHaveWordForExtent的奇怪内容。 ResultOfHaveWordForExtent
现在有一个length
方法,需要Long
,最后返回Assertion。
因此,你的陈述被贬低为:
convertToAnyShouldMatcher(result).should(have).length(3)
请注意,此链中的方法调用和参数是交替的。因此,如果您不确定它是should be
还是shouldBe
,只需计算表达式,并查看您要提供的下一个参数是处于奇数位置还是偶数位置