2016-08-15 10 views
3

私はMoqを初めて使用しており、約5年間で単体テストしていません。多くのことが変わりました。Moqを使用する場合、実装されたメソッド実装された模擬インターフェイスはありますか?

私は頭の中で基本を包み込んでいます。

私はインターフェイスを持っています。

public interface ILogger 
{ 
    void Log(string message) 
} 

このインターフェイスは、次のように実装されています。

public class MyLogger : ILogger 
{ 
    public virtual void Log(string message) 
    { 
     StaticClass.StaticMethodNotToBeCalled<ILogger>().Log(message); 
    } 
} 

私は次のロジックをテストしています。

public class MyClass 
{ 
    public MyMethod(int z) 
    { 
     var logger = new MyLogger(); 

     if(z == 5) 
     { 
      logger.Log("it is true"); 

      return true; 
     } 

     logger.Log("it is false); 

     return false; 
    } 
} 

私のテストは次のようになります。

[TestMethod] 
public void Test_MyMethod() 
{ 
    var mock = new Mock<ILogger>(); 

    mock.Setup(y => y.Log(It.IsAny<string>()).Verifiable(); 

    var o = new MyClass(); 

    var result = o.MyMethod(5); 

    Assert.IsTrue(result);   

    mock.Verify(); 

} 

私が取り組んでいる問題は、ILoggerインターフェイスの実装で呼び出される静的メソッドです。

私はちょうどモックが正確に何をすべきかをよく理解していないと思っています。

ILogger.Logはいつでもオーバーライドされ、その静的メソッドは呼び出されません。

これは可能ですか?

これは間違った方法ですか?

答えて

4

​​インターフェイスに基づいてモックを作成していますが、MyClassインスタンスにモックを注入していません。 MyClassを実行すると、​​モックの代わりにLoggerのインスタンスが使用されます。 MyClassののコンストラクタであなたが今​​インタフェースを実装するクラスのインスタンスを受け入れていることを

public class MyClass 
{ 

    private ILogger logger; 
    public MyClass(ILogger loggerInstance) 
    { 
     logger=loggerInstance; 
    } 
    public MyMethod(int z) 
    { 

     if(z == 5) 
     { 
      logger.Log("it is true"); 

      return true; 
     } 

     logger.Log("it is false); 

     return false; 
    } 
} 

注:

ではなく、あなたのクラスのためにこのような何かを考えてみましょう。これは、実際の具体的なロガーの代わりに、あなたのモックオブジェクトを注入することができます:

[TestMethod] 
public void Test_MyMethod() 
{ 
    var mock = new Mock<ILogger>(); 

    mock.Setup(y => y.Log(It.IsAny<string>()).Verifiable(); 

    var o = new MyClass(mock.Object); 

    var result = o.MyMethod(5); 

    Assert.IsTrue(result);   

    mock.Verify(); 

} 

依存性の注入はあなたのシナリオに欠けている概念です。多くの場合、ユニットでテスト可能なコードを書くことが不可欠です。

+0

こんにちはありがとうございます。私は嘲笑されていることは自然界ではそれほどグローバルではないとうんざりしているが、それは問題ない。私はもともと、このインスタンスのクラスがコントローラであるため、コンストラクタで何もしないようにしていましたが、このパターンはまだうまく動作します。 – moctopus

関連する問題