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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top