我想知道为什么ScalaTest的行为与Specs2有所不同。
规格2
<!doctype html>
<html>
<head>
<script type="application/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script type="application/javascript" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
</head>
<body>
<label>Search for Item</label>
<input id="searchbar"></input>
<button id="logrow">Log row data</button>
<table></table>
</body>
</html>
"" must be equalTo 3
ScalaTest
TestSpec.scala:11:26: type mismatch;
[error] found : Int(3)
[error] required: String
[error] "" must be equalTo 3
3 should === ("r")
默认情况下,ScalaTest仅在运行时失败,所有内容均被视为“任意”。
有一个Supersafe插件可以更好地进行检查(或[info] Done compiling.
[info] TestTest:
[info] Dummy test
[info] - should fail *** FAILED ***
[info] "" did not equal 3 (PersistentTaskRuntimeTest.scala:21)
),但是这些感觉就像是骇客,因为Specs2仅使用scala编译器来要求两个值的类型之间存在子类型/超类型关系。
作为参考,这是使用TypeCheckedTripleEquals
时的输出,请注意骇客TypeCheckedTripleEquals
CanEqual
那么这背后的原理是什么?
答案 0 :(得分:0)
TypeCheckedTripleEquals
使用的是generalised type constraints,例如{p}中的B <:< A
implicit override def typeCheckedConstraint[A, B](implicit equivalenceOfA: Equivalence[A], ev: B <:< A): A CanEqual B
这是强制执行编译时安全性的标准Scala功能,已在许多广泛使用的Scala库中使用。