true - scalatest tutorial
Scalatest-cómo probar println (3)
¿Hay algo en Scalatest que me permita probar la salida a la salida estándar a través de una declaración de println
?
Hasta ahora he estado usando FunSuite with ShouldMatchers
.
Por ejemplo, ¿cómo comprobamos la salida impresa de
object Hi {
def hello() {
println("hello world")
}
}
La forma habitual de probar las declaraciones de impresión en la consola es estructurar su programa de manera un poco diferente para que pueda interceptar esas declaraciones. Por ejemplo, puedes introducir un rasgo de Output
:
trait Output {
def print(s: String) = Console.println(s)
}
class Hi extends Output {
def hello() = print("hello world")
}
Y en tus pruebas puedes definir otro rasgo que MockOutput
realmente intercepta las llamadas:
trait MockOutput extends Output {
var messages: Seq[String] = Seq()
override def print(s: String) = messages = messages :+ s
}
val hi = new Hi with MockOutput
hi.hello()
hi.messages should contain("hello world")
Puede reemplazar donde escribe println utilizando Console.setOut (PrintStream)
val stream = new java.io.ByteArrayOutputStream()
Console.setOut(stream)
println("Hello world")
Console.err.println(stream.toByteArray)
Console.err.println(stream.toString)
Obviamente, puede utilizar cualquier tipo de flujo que desee. Puedes hacer lo mismo para stderr y stdin con
Console.setErr(PrintStream)
Console.setIn(PrintStream)
Si solo desea redirigir la salida de la consola por un tiempo limitado, use los métodos withOut
y withErr
definidos en la Console
:
val stream = new java.io.ByteArrayOutputStream()
Console.withOut(stream) {
//all printlns in this block will be redirected
println("Fly me to the moon, let me play among the stars")
}