2017-01-17 7 views
0

私はこの方法では、これがFakeItEasyでvoidメソッドをスキップする方法は?

public class Logger : IMyLogger 
{ 
    public void ConfigLogger() 
    { 
     //Serilog logging code I´m trying to not call in my unittests. 
     Log.Logger = new LoggerConfiguration() 
     .MinimumLevel.Debug() 
     .CreateLogger(); 
    } 
} 

Loggerクラスであり、これは離れて嘲笑しようとしている - 私は(コールしない私のunittestのである - 私単体テスト

public void SomeMethod() 
{ 
    IMyLogger log = new Logger(); 
    log.ConfigLogger(); // Trying to not call this method 

    //...some other code... 
} 

をこのコードを持っています運なしConfigLogger()メソッドの内部コード。だから、

public void Test() 
{ 
    var logger = A.Fake<IMyLogger>(); 
    A.CallTo(() => logger.ConfigLogger()).DoesNothing(); //Not working.. 
} 

- 私、私はここに行方不明何?なぜこれはちょうどこのようにすべきだと思いますか? Serilogの専門家がSerilogのユニットテストのためのよりよい方法を提供しても、私は "FakeItEasy a void method"の方法を知りたいと思っています。

答えて

1

実動コードではまだ具体的なインスタンスLoggerが使用されています。 FakeItEasyはFakeItEasyによって作成されたFakes以外の何らかの動作に影響を与えることはできません。

使用するパターンは次のとおりです。

  1. フェイク
  2. は、テスト
  3. の下で生産クラスのインスタンスにフェイクを提供設定本番コードがコラボ
  4. として使用することにフェイクを作成
012に問い合わせる必要に応じて、生産コード
  • を実行します

    生産コードが書かれているので、共同作業者を投入する機会はありません。共同作業者(log)を作成します。 Loggerメソッドを呼び出さないようにするには、代わりのIMyLoggerを注入する方法を提供する必要があります。

  • 0

    メソッド内でロガーをインスタンス化して構成する必要はありません。

    何か

    よう
    public class SomeClass() 
    { 
        IMyLogger log; 
    
        public SomeClass(IMyLogger logger) 
        { 
         this.log = logger; 
        } 
    
        public void SomeMethod() 
        { 
         // code you want to test 
        } 
    } 
    

    それからちょうどテスト中のあなたのクラスにそれを渡します

    public void Test() 
    { 
        var logger = A.Fake<IMyLogger>(); 
        var someClass = new SomeClass(logger); 
    
        // test someClass.SomeMethod() 
    } 
    
    関連する問題