加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

ScalaTest语法如何工作?

发布时间:2020-12-16 10:07:55 所属栏目:安全 来源:网络整理
导读:我在 Scala中做了一些编程,我知道,例如, xs map f 是一样的 xs.map(f) 但我不知道如何将这种语法概括为像ScalaTest的语法, it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[String] evaluating { em
我在 Scala中做了一些编程,我知道,例如,

xs map f

是一样的

xs.map(f)

但我不知道如何将这种语法概括为像ScalaTest的语法,

it should "throw NoSuchElementException if an empty stack is popped" in {
  val emptyStack = new Stack[String]
  evaluating { emptyStack.pop() } should produce [NoSuchElementException]
}

我主要想知道看起来像多字构造的东西,即应该产生的东西.它很整洁.

解决方法

这种语法是运算符表示法中的方法调用,但不仅仅是三个令牌.正如你已经提到的:

xs map f

手段:

xs.map(f)

但你可以进一步说:

xs map f map g

意思是:

xs.map(f).map(g)

例如,在ScalaTest匹配器中,您可以说:

result should not be null

这会被编译器贬低为:

result.should(not).be(null)

这个:

it should "throw an exception" in { ... }

变得卑鄙:

it.should("throw an exception").in { ... }

最后的花括号实际上只是将花括号(测试代码)之间的代码传递给in方法的一种方法,包装为无参数函数.所以这些都是同一个想法.运算符表示法连续使用两次.

你问过的最后一个有点不同:

evaluating { ... } should produce [IllegalArgumentException]

这变成了:

评估{…}首先是评估,因为花括号给它优先.这是一个方法调用,您正在调用一个名为“evaluate”的方法,将花括号之间的代码作为无参数函数传递.返回一个应该调用的对象.所以应该是通过调用求值返回的对象的方法.实际需要的是调用产品的结果.这里的produce实际上是一个方法,它有一个类型参数,如[IllegalArgumentException].它必须以这种方式完成,因此Scala编译器可以“穷人 – 实现”该类型参数.它将隐式“Manifest”参数传递给可以为IllegalArgumentException提供java.lang.Class实例的产品.因此,当调用方法时,它有一个包含传递给求值的代码的函数,以及一种查找放在方括号中的异常类型的java.lang.Class的方法.因此它执行try中包含的代码块,捕获异常,将其与预期进行比较.如果没有抛出异常或错误的异常,则should方法抛出TestFailedException.否则,should方法只是静默返回.

所以,答案就是这条线被玷污了:

(evaluating { ... }).should(produce[IllegalArgumentException] (compilerSuppliedManifest))

故事的寓意是,像这样的高级代码使得更容易看到程序员的意图,但往往更难理解代码的实际工作方式.在实践中大部分时间你所关心的只是意图,但是你需要知道某些东西是如何工作的.在Scala中的这种情况下,您可以将-Xprint:typer作为命令行arg传递给Scala编译器,它将在所有desugaring发生后打印出您的文件版本.所以你可以在需要时看到什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读