Мне было интересно, почему ScalaTest ведет себя иначе, чем Specs2.
Specs2
"" must be equalTo 3
TestSpec.scala:11:26: type mismatch;
[error] found : Int(3)
[error] required: String
[error] "" must be equalTo 3
ScalaTest
3 should === ("r")
[info] Done compiling.
[info] TestTest:
[info] Dummy test
[info] - should fail *** FAILED ***
[info] "" did not equal 3 (PersistentTaskRuntimeTest.scala:21)
ScalaTest по умолчанию завершается с ошибкой только во время выполнения, все сравнивается как Any-to-Any.
Существует плагин Supersafe для получения более качественных проверок (или TypeCheckedTripleEquals
), но они выглядят как хаки, поскольку Specs2 просто использует компилятор scala, чтобы требовать, чтобы типы двух значений сравнивались в отношениях подтип / супертип.
Для справки это вывод при использовании TypeCheckedTripleEquals
, помните хаки CanEqual
TestTest.scala:21:7: types String and Int do not adhere to the type constraint selected for the === and !== operators; the missing implicit parameter is of type org.scalactic.CanEqual[String,Int]
[error] "" should === (3)
[error] ^
Так в чем же причина этого?
- Менее тяжелый для компилятора scala?
- Меньше кода для написания для ScalaTest?
- Менее скрытая магия (загадочные сообщения об ошибках)?
- Выдвинуть плагин коммерческого компилятора?