2016-03-27 2 views
0

Ich versuche, einen Integrationstest für eine kleine Befehlszeile App zu schreiben, die ich mit Scala und SBT schreibe.Legen Sie ein Befehlszeilenargument für Scalatest mit SBT fest

> run "my arg" 

Das Argument "mein arg" zugegriffen werden mit args(0) in der App: Meine app würde in der Regel von der SBT Prompt wie so ausgeführt werden. Wie kann ich für einen Integrationstest den Aufruf run mit einem Argument simulieren und die Konsolenausgabe bestätigen?

+0

Sie können Ihre Antwort hier finden: http://stackoverflow.com/questions/16380699/redirect-stdout-in-another-thread –

+0

Danke, aber ich verstehe das nicht - wie rufe ich 'main()' während man sich streitet? – harryg

Antwort

1

Ihre App benötigt eine object mit main Methode, die Array[String] als Parameter verwendet. Es sieht aus wie dieses

object Main extends App { 
    print("hi, " + args(0)) 
} 

oder ähnliche

object Main { 
    def main(args: Array[String]) = print("hi, " + args(0)) 
} 

Auf jeden Fall haben Sie auf jeden Fall diese Art von Einstiegspunkt, wenn Sie > run "my arg" in sbt tun können.

Es ist nur ein object mit einer Methode namens main, die Sie anrufen können, wo immer Sie wollen. Importieren Sie es einfach und verwenden Sie:

Main.main(Array("my arg")) 

, die den Text auf der Konsole bei der Ausführung gedruckt werden würde. Wir müssen die Konsolenausgabe zu einem anderen Stream umleiten, um sie überprüfen zu können.

Antwort Verwendung von Redirect stdout in another thread können Sie mit so etwas wie diese kommen:

val baos = new ByteArrayOutputStream 
val ps = new PrintStream(baos) 
Console.withOut(ps)(Main.main(Array("my arg"))) 
val output = baos.toString 

Und Sie können alle Arten von Tests auf output Wert tun

Sie können dann eine Hilfsmethode erstellen, dies zu handhaben für Sie

def outputFor(args: String*): String = { 
    val baos = new ByteArrayOutputStream 
    val ps = new PrintStream(baos) 
    Console.withOut(ps)(Main.main(args.toArray)) 
    baos.toString 
} 

Und dann testen easly App

"My app" should "greet me" { 
    outputFor("harryg") shouldBe "hi, harryg" 
} 

Nur um zu verdeutlichen, die ganze Lösung hat nichts mit sbt selbst zu tun, nennen wir das Programm direkt in einer ähnlichen Weise, dass sbt es tun würde.