2

Logger.WriteコマンドがMVCコントローラーの1つで正しいメッセージとともに実行されることを検証する単体テストを作成したいと思います。

ロガーが書き込むリスナーをモックすることはできますが、保存されているメッセージに到達する方法がわかりません。例えば、

var mockListener = new Mock<MyTraceListener>();
// the .Write method is void so I can't use .Returns() on my mock
mockListener.Setup(listener => listener.Write(It.IsAny<string>()))

MyController controller = new MyController();
MyController.Index();

//次に、Indexメソッドは、MyTraceListenerに書き込むカテゴリに対して次のLogger.Write()を呼び出します。

Logger.Write("test message", "MyCategory");

このロガーへの書き込みコマンドは、入力文字列を返したり、アサーションステートメントで検証するためのパラメーターに保存したりしません。Moqの検証またはセットアップの1つ、または.when(これが何であれ)関数を使用して、ログに記録されたメッセージを取得したり、少なくともメッセージが実行されたことを確認したりできますか?

できれば、ログエントリを単体テストの変数に格納して、次のことを表明できるようにします。

Assert.AreEqual(loggedMessage, "test message");

誰かがこれを行うための戦略を知っているなら、私はそれを大いに感謝します。

4

2 に答える 2

3

Entlib 5.0 を使用していると仮定すると、既にモック ポイントがあります。Logger.Write を直接使用する代わりに、LogWriter のインスタンスをコントローラーに挿入します。その後、テストで LogWriter オブジェクトをモックアウトできます。

于 2012-06-28T22:44:08.247 に答える
0

Writeメソッドからの入力を単体テストに戻す方法としてコールバックを使用したいとします。

Loggersは静的であるため、テストでMoqを使用するには、これらの静的メソッドへの呼び出しをラップする必要があります。以下のサンプルクラスは、それを実現するために必要なすべてのことです。また、ラッパーを使用するようにコードを更新する必要がありますが、これは面倒な場合があります。

これを実現するためのサンプルテストとクラス構造を次に示します。

public class Logger
{ 
   public virtual void Write( string message, string category )
   {
      Loggers.Write( message, category );
   }
}

[TestMethod]
public void SampleTest()
{
   string input = string.Empty;

   var mockLogger = new Mock<Logger>();
   mockLogger.Setup( l => l.Write( It.IsAny<string>(), It.IsAny<string>() ) ).Callback( ( string message, string category ) => input = message );


   mockLogger.Object.Write( "test", "category" );

   Assert.AreEqual( "test", input );
}

Moqバージョン4.0.10827.0を使用していることに注意してください。

これがお役に立てば幸いです。

于 2012-06-28T13:33:01.623 に答える