2011-09-16 12 views
0

私のアプリケーションには、静的ユーティリティメソッドがあり、ロガーのような静的インスタンスを返すstaticFactoryクラスがあります。私のアプリケーションの残りの部分は、ロガーを渡すことなくどこからでもロガーへの参照を取得できます(一般的な設計方法)。モックされたオブジェクトでMoqを使って間接的に呼び出されるメソッドを確認する

私のアプリケーションの別の部分であるDbCacheProviderには、ロガーを呼び出すメソッドがあり、内部的には工場からのロガーへの参照を取得して呼び出しを行います。

私の質問は、Moqを使って、DbCacheProvider内のメソッドによってロガーのメソッドが呼び出されていることを確認したいのです。私はパラメータとしてDbCacheProviderにモック・ロガーを渡すときに依存性注入を使用してこれを行うことができますが、私はロガーを渡していません(したくない)。では、DbCacheProviderがロガーを呼び出していることを確認するにはどうすればよいですか?

答えて

0

コンストラクタを介してロガーを渡したくない場合は、ユニットテストを実行している間にあなたのProviderFactoryを変更して、モックされたロガーを返す必要があります。

はとにかく多くの場合、依存性注入を設定することが示唆だ理由のカップルがあります:

  1. あなたのテストがより簡単であり、ユニティ、Ninjectのようなカスタム工場
  2. のIoCフレームワークとfinaglingを伴わず、 Autofacを使用すると、依存関係がこのように設定されたときにオブジェクトを簡単に作成できます。このようにすべてのオブジェクトを設定すると、フレームワークは適切なオブジェクトを作成し、それを渡すという重い作業をすべて行います。依存関係注入は自動的に行われ、あなたの負担にはなりません。
0

古い質問には答えずに、私は同様の問題を抱えていたし、このようにそれを解決:

私は、次のサンプルコードを持っており、メソッドが呼び出されただけでなく、ことを確認する必要がありますが、具体的に呼ばれました値。

public interface ILog 
{ 
    void Info(string message); 
} 

public interface ILogFactory 
{ 
    ILog GetLogger(); 
} 

これは、インタフェース項目が注入されているテストされているクラス、次のとおりです。

public class NewAction 
{ 
    readonly ILogFactory _logger; 

    public NewAction(ILogFactory logger) 
    { 
     _logger = logger; 
    } 

    public void Step1() 
    { 
     _logger.GetLogger().Info("Step 1"); 
    } 

    public void Step2() 
    { 
     _logger.GetLogger().Info("Step 2"); 
    } 
} 

これは明らかに私の実際のコードの非常に単純化した図であるが、私はステップ1とステップ2いることを確認するために必要な予想どおりに動作し、ログに正しい値を渡した場合、正しい順序で確実に発生する必要があります。私のテスト:

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     // Arrange 
     var log = new Mock<ILog>(); 

     var factory = new Mock<ILogFactory>(); 
     factory.Setup(l => l.GetLogger()).Returns(log.Object); 

     // Act 
     var action = new NewAction(factory.Object); 
     action.Step1(); 
     action.Step2(); 

     // Assert 
     factory.Verify(l => l.GetLogger()); 
     log.Verify(l => l.Info(It.Is<string>(s => s == "Step 1"))); 
     log.Verify(l => l.Info(It.Is<string>(s => s == "Step 2"))); 
    } 
} 

希望します。

関連する問題