'结果的长度应为3':ScalaTest DSL如何工作?

时间:2018-02-04 09:15:20

标签: scala dsl scalatest

ScalaTest允许您编写如下代码:

result should have length 3

进行此解析的内幕是什么?它只是使用中缀表示法,即它是

result.should(have).length(3)

通过一些涉及暗示的魔法?还是有更复杂的事情发生?

1 个答案:

答案 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,只需计算表达式,并查看您要提供的下一个参数是处于奇数位置还是偶数位置