'result should have length 3':ScalaTest DSL 是如何工作的?

'result should have length 3': How does the ScalaTest DSL work?

ScalaTest 允许您编写如下代码:

result should have length 3

进行此解析的幕后情况是什么?它只是使用中缀符号吗,即它是

result.should(have).length(3)

通过一些涉及隐式的魔法?还是发生了更复杂的事情?

你完全正确:隐式 + 中缀语法很神奇。

让我们拆开你的例子。在

result should have length 3

表达式result(通常)没有方法should。然而,如果你 mixin Matchers, then you get the implicit conversion convertToAnyShouldWrapper, which returns an AnyShouldWrapperAnyShouldWrapper 现在有一个重载方法 should

should 的一个版本采用 HaveWord as argument, and returns a weird thing called ResultOfHaveWordForExtent. The ResultOfHaveWordForExtent now has a length method, which takes a Long, and finally returns an Assertion

因此,您的语句被脱糖为:

convertToAnyShouldMatcher(result).should(have).length(3)

请注意,方法调用和参数在此链中交替出现。因此,如果您不确定它是 should be 还是 shouldBe 之类的东西,只需计算表达式,然后查看您要提供的下一个参数是奇数还是偶数。