В Scala есть несколько хороших библиотек для тестирования (Specs, ScalaTest, ScalaCheck). Однако благодаря мощной системе типов Scala важные части API, разрабатываемые в Scala, выражаются статически, обычно в форме нежелательного или недопустимого поведения, которое предотвращается компилятором.
Итак, как лучше всего проверить, предотвращает ли что-то компилятор при разработке библиотеки или другого 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, вызываемого интерпретатором.