为什么默认情况下,ScalaTest在匹配时不强制输入类型?

时间:2019-07-05 09:18:05

标签: scala scalatest specs2

我想知道为什么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

那么这背后的原理是什么?

  • 对于scala编译器而言,负担较轻吗?
  • 缺少为ScalaTest编写的代码?
  • 缺少隐式魔术(隐式错误消息)?
  • 按下商业编译器插件?

1 个答案:

答案 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库中使用。