2017-01-17 1 views
0

Ich habe diesen Code in einem bin ich MethodeWie "überspringen" Sie die Void-Methode mit FakeItEasy?

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

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

Unittesting Wo dies der Logger-Klasse aufrufen

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(); 
    } 
} 

Und das ist das meine Unittest, wo ich versuche weg (nicht zu verspotten ist der Code innerhalb des ConfigLogger() -Methode ohne Glück.

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

Also, was ich bin ich hier fehlt? Warum denke ich, sollte das genau so sein? Obwohl Serilog Spezialist mir einen besseren Weg gibt, Serilog zu vereinen, würde ich auch gerne herausfinden, wie man "FakeItEasy a void method" macht.

Antwort

1

Ihr Produktionscode verwendet immer noch eine konkrete Instanz Logger. FakeItEasy kann das Verhalten von FakeItEasy-erstellten Fakes nicht beeinflussen.

Das Muster für den Einsatz ist:

  1. eine Fälschung schaffen, dass Ihre Produktion Code als Kollaborateur
  2. configure die gefälschten
  3. das Fake zu einer Instanz der Produktionsklasse im Test bieten verwenden
  4. führen den Produktionscode
  5. optional den Fälschungs
012 abfragen

Da Ihr Produktionscode jetzt geschrieben wird, gibt es keine Möglichkeit, einen Kollaborateur zu injizieren - er erstellt seinen eigenen Mitarbeiter (log). Um zu vermeiden, Logger Methoden aufzurufen, müssen Sie eine Möglichkeit bereitstellen, eine Alternative IMyLogger zu injizieren.

0

Sie sollten es vermeiden, Ihren Logger innerhalb der Methode instanziieren und konfigurieren zu müssen.

So etwas wie

public class SomeClass() 
{ 
    IMyLogger log; 

    public SomeClass(IMyLogger logger) 
    { 
     this.log = logger; 
    } 

    public void SomeMethod() 
    { 
     // code you want to test 
    } 
} 

Dann ist es nur unter Test in der Klasse übergeben:

public void Test() 
{ 
    var logger = A.Fake<IMyLogger>(); 
    var someClass = new SomeClass(logger); 

    // test someClass.SomeMethod() 
} 
Verwandte Themen