ensaios estáticos para Scala
-
13-09-2019 - |
Pergunta
Há alguns bons bibliotecas para testar em Scala ( Specs , ScalaTest , ScalaCheck ). No entanto, com o sistema de tipo poderoso do Scala, partes importantes de uma API a ser desenvolvido em Scala são expressos estaticamente, geralmente sob a forma de um comportamento indesejável ou não permitido sendo impedido pelo compilador.
Então, qual é a melhor maneira de testar se algo é impedido pelo compilador ao criar uma biblioteca ou outro API? É insatisfatório para comentar o código que é suposto ser uncompilable e, em seguida, uncomment-lo para verificar.
A inventado exemplo testando lista:
val list: List[Int] = List(1, 2, 3)
// should not compile
// list.add("Chicka-Chicka-Boom-Boom")
Será uma das bibliotecas de teste existentes lidar com casos como este? Existe uma abordagem que as pessoas usam que as obras?
A abordagem que eu estava pensando era ao código de incorporação em uma string de aspas triplo ou um elemento xml e chamar o compilador em meu teste. código de chamada procurando algo como isto:
should {
notCompile(<code>
val list: List[Int] = List(1, 2, 3)
list.add("Chicka-Chicka-Boom-Boom")
</code>)
}
Ou, algo ao longo das linhas de um href="http://expect.nist.gov/" rel="nofollow noreferrer"> esperar do tipo roteiro
Solução
Eu criei algumas especificações executando alguns trechos de código e verificando os resultados do intérprete.
Você pode ter um olhar para o Snippets característica. A idéia é armazenar em alguns org.specs.util.Property [trechos] o código para executar:
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
A principal desvantagem que eu encontrei com esta abordagem foi a lentidão do intérprete. Eu ainda não sei como isso poderia ser acelerado.
Eric.