在Scala中有一些很好的库可供测试(Specs,ScalaTest,ScalaCheck)。但是,使用Scala强大的类型系统,Scala中开发的API的重要部分是静态表达的,通常是编译器阻止某些不受欢迎或不允许的行为。
那么,在设计库或其他API时,测试编译器是否阻止某些内容的最佳方法是什么?注释掉应该是不可编译的代码并将其取消注释以进行验证是不令人满意的。
一个人为的例子测试列表:
val list: List[Int] = List(1, 2, 3)
// should not compile
// list.add("Chicka-Chicka-Boom-Boom")
现有的一个测试库是否处理这样的情况?是否存在人们使用的方法?
我正在考虑的方法是将代码嵌入到三引号字符串或xml元素中,并在我的测试中调用编译器。调用代码看起来像这样:
should {
notCompile(<code>
val list: List[Int] = List(1, 2, 3)
list.add("Chicka-Chicka-Boom-Boom")
</code>)
}
或者,在解释器上调用expect - 类型脚本。
答案 0 :(得分:7)
我创建了一些执行某些代码片段并检查解释器结果的规范。
您可以查看Snippets特征。我的想法是在一些org.specs.util.Property [Snippet]中存储要执行的代码:
val it: Property[Snippet] = Property(Snippet(""))
"import scala.collection.List" prelude it // will be prepended to any code in the it snippet
"val list: List[Int] = List(1, 2, 3)" snip it // snip some code (keeping the prelude)
"list.add("Chicka-Chicka-Boom-Boom")" add it // add some code to the previously snipped code. A new snip would remove the previous code (except the prelude)
execute(it) must include("error: value add is not a member of List[Int]") // check the interpreter output
我发现这种方法的主要缺点是解释器的速度慢。我还不知道如何加快这一步。
埃里克。