“结果应为3”:ScalaTest DSL如何工作?

ScalaTest允许您编写如下代码:

result should have length 3

要进行此解析的原因是什么?是否仅使用中缀符号,即

result.should(have).length(3)

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

最佳答案
您完全正确:隐式中缀语法很神奇.

让我们分开您的例子.在

result should have length 3

表达式结果(通常)没有该方法应有的方法.但是,如果您混合了Matchers,则会得到隐式转换convertToAnyShouldWrapper,它返回AnyShouldWrapper.此AnyShouldWrapper现在应具有一个重载方法.

应该使用的版本之一以HaveWord作为参数,并返回一个名为ResultOfHaveWordForExtent的怪异事物.ResultOfHaveWordForExtent现在具有一个length方法,该方法采用Long,最后返回一个Assertion.

因此,您的陈述被减为:

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

注意,方法调用和参数在此链中交替出现.因此,如果您不确定是应该是还是应该是,只需计算一下表达式,然后查看您要提供的下一个参数是在奇数还是偶数位置即可.

转载注明原文:“结果应为3”:ScalaTest DSL如何工作? - 代码日志