Pregunta

Hay algunas bibliotecas agradables para las pruebas en Scala ( Especificaciones , ScalaTest , ScalaCheck ). Sin embargo, con el sistema de tipo de gran alcance de Scala, partes importantes de una API que se desarrollan en Scala se expresan de forma estática, por lo general en forma de un comportamiento indeseable o anulado siendo impedido por el compilador.

Así que, ¿cuál es la mejor manera de probar si algo es impedido por el compilador en el diseño de una biblioteca u otra API? Es poco satisfactoria para comentar código que se supone que es uncompilable y luego quitar los comentarios que verificar.

Un ejemplo de lista de pruebas artificial:

val list: List[Int] = List(1, 2, 3)
// should not compile
// list.add("Chicka-Chicka-Boom-Boom")

¿Tiene una de las bibliotecas de pruebas existentes manejan casos como este? ¿Hay un enfoque que usa la gente que trabaja?

El enfoque estaba considerando era para incrustar el código en una cadena triple cita o un elemento XML y llamar al compilador en mi prueba. Código de llamada buscando algo como esto:

should {
  notCompile(<code>
    val list: List[Int] = List(1, 2, 3)
    list.add("Chicka-Chicka-Boom-Boom")
  </code>)
}

O, algo a lo largo de las líneas de una esperar -type script llamado en el intérprete.

¿Fue útil?

Solución

He creado algunas de las especificaciones que ejecutan algunos fragmentos de código y control de los resultados de la intérprete.

Puede echar un vistazo a la fragmentos rasgo. La idea es almacenar de alguna org.specs.util.Property [fragmento] el código para ejecutar:

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

El principal inconveniente que encontré con este enfoque fue la lentitud del intérprete. No sé todavía cómo esto podría ser acelerado.

Eric.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top