2016-03-27 12 views
0

私はScalaとSBTで書いている小さなコマンドラインアプリケーションの統合テストを書こうとしています。私のアプリは、通常、そのようSBTプロンプトから実行することになります。SBTでScalatestのコマンドライン引数を設定

> run "my arg" 

引数「私のargは」args(0)でアプリにアクセスします。統合テストの場合、引数付きのrunの呼び出しをシミュレートし、コンソール出力をアサートする方法はありますか?

+0

ここで答えを見つけることができます:http://stackoverflow.com/questions/16380699/redirect-stdout-in-another-thread –

+0

ありがとうございますが、私はそれを理解できません - どうすれば 'main()'引数を渡している間に? – harryg

答えて

1

アプリには、をパラメータとするmainメソッドを持つobjectメソッドが必要です。 それはあなたがSBTで> run "my arg"を行うことができればとにかく、あなたは間違いなく、エントリポイントのこの種を持っているこの

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

またはこの

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

などのように見えます。

mainと呼ばれる方法を使用して、電話をかけることができるのはobjectです。それをインポートして使用します:

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

実行時にコンソールにテキストを出力します。私たちはコンソール出力を確認するためにコンソール出力を他のストリームにリダイレクトする必要があります。

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

そして、あなたはoutput

にテストのすべての並べ替えを行うことができますが、その後のためにこれを処理するためのヘルパーメソッドを作成することができます:あなたはこのような何かを思い付くことができRedirect stdout in another threadからの回答を使用して

あなた

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

そしてイースリーあなたのアプリが

をテスト
"My app" should "greet me" { 
    outputFor("harryg") shouldBe "hi, harryg" 
} 

解決策全体はsbtとはまったく関係がありません。私たちは直接、sbtと同様の方法でプログラムを呼び出します。

関連する問題