2017-01-17 21 views
0

У меня есть этот код в методе I'm модульного тестированияКак «пропустить» метод void с помощью FakeItEasy?

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

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

Где этот класс Logger

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

И это мой UnitTest, где я пытаюсь издеваться прочь (не называйте код внутри метода ConfigLogger() без удачи.

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

Так что I'm я здесь отсутствует? Почему Думаю, это должно быть так? Несмотря на то, что специалист Serilog дал мне лучший способ убрать Serilog, я также хотел бы узнать, как «FakeItEasy - недействительный метод».

ответ

1

Ваш производственный код по-прежнему использует конкретный экземпляр Logger. FakeItEasy не может влиять на поведение ничего, кроме FakeItEasy-созданных подделок.

Шаблон для использования является:

  1. создать Фальшивка, что ваш код продукции будет использовать в качестве соавтора
  2. Сконфигурируйте Поддельные
  3. обеспечивает Поддельные к экземпляру класса производства испытываемого
  4. выполнить код производства
  5. необязательно опрашивать поддельный

Поскольку ваш производственный код написан сейчас, нет возможности внедрить соавтора - он создает свой собственный соавтор (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() 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^