2009-08-17 8 views
8

私はユニットテストの初心者です。コンソールの出力を確認するにはどうしたらいいですか? 私は単体テストヘルプ。コンソールへのメッセージ出力をテストするにはどうすればよいですか?

namespace XXShapes 
{ 
    public abstract class XXShape 
    { 
     public virtual void DrawXXShape() 
     { 
      Console.WriteLine("The XXShape was drawn."); 

     } 
    } 

public class XXCircle : XXShape 
{ 
    public override void DrawXXShape() 
    { 
     Console.WriteLine("The XXCircle was drawn."); 
    } 
} 

は}

namespace XXShapes.Test 
{ 
    [TestFixture] 
    public class XXShapeTest 
    { 
     [Test] 
     public void MyFirstTest() 
     { 
      XXShape s = new XXCircle(); 
      string expected = "The XXCircle was drawn."; 
      s.DrawXXShape(); 
      string actual = Console.ReadLine(); 
      Assert.AreEqual(expected, actual); 
     } 
    } 


} 

どのように私はこれを正しくテストする必要がありますか? ありがとうございます。 乾杯、 〜ck

答えて

0

これはあなたのやることではありません。選択したフレームワークがどのように機能するかに応じて、

Assert.IsTrue(foo.Field, Equals, "hello") 

:あなたのテストあなたは、通常のようなもので、オブジェクトの状態をチェックするには

。したがって、このモデルに準拠するように、一般的にはアプローチを変更する必要があります。

4

「Console.WriteLine」ルーチンを動作させる必要があるため、テストする必要はありません。これは自分のコードではないので、なぜテストしたいのですか?

あなたができる
public override void DrawXXShape() 
{ 
    Console.WriteLine("The XXCircle was drawn."); 
} 

:あなたは正しい言い換えれば「Console.WriteLineを」

に渡された文字列、代わりのを作るかどうかをテストする必要が

public override void DrawXXShape() 
{ 
    Console.WriteLine(produceXxCircle()); 
} 

public string produceXxCircle() 
{ 
    return "The XXCircle was drawn."; 
} 

し、その後でテストケース:

Assert.AreEqual(produceXxCircle(), "The XXCircle was drawn."); 

希望します。 Regads サイモン

+0

Assertは、drawメソッドが呼び出されたのではなく、produceXxCircle()メソッドをテストするだけです。 –

+0

確かに、何をテストしたいですか? Console.WriteLineがコンソールに文字列を正しく出力していれば? Console.WriteLineはあなたのコードではないので、これをテストすべきではありません。フレームワークの一部です –

+0

ええ、元のコードは 's.DrawXXShape();'を呼び出し、 'DrawXXShape'メソッドが呼び出されたことを確認して、かなり空のテストを実行しようとしています。しかし、少なくともそれはテストを開始しています。 –

14

リテラルの答えは、あなたがその内容あなたが後で調べることができますMemoryStreamをまたは類似した、にstdoutを指示するために、テスト中のクラスを呼び出す前にConsole.SetOutを使用することになります。

より良い答えは、DrawXXShapeメソッドが呼び出されることを期待して、抽象クラスの具体的なインスタンスを作成するためにRhino Mocksのような模擬フレームワークを使用する方がよいでしょう。

0

私は、他のいくつかのテストが描画能力をテストしていると仮定しています - あなたのクラスが特にコンソールに何かを書くことをテストしたいなら、あなたはコンソールに書くというアイデアを抽象化するべきです。

WriteLine()メソッドでインターフェイスを作成し、このインターフェイスを実装するインスタンスをXXShapesに挿入します。テストでは、書き込まれた文字列をキャプチャしてその内容をテストすることができるモックまたはスタブを挿入できます。

関連する問題