Как пропустить метод 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();
    }
}

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

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

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


person Sturla    schedule 17.01.2017    source источник


Ответы (2)


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

Схема использования такова:

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

Так как ваш производственный код написан сейчас, нет возможности внедрить коллаборатора — он делает своего коллаборатора (log). Чтобы избежать вызова методов Logger, вам нужно предоставить способ внедрить альтернативный IMyLogger.

person Blair Conrad    schedule 17.01.2017

Вам следует избегать создания и настройки вашего регистратора в методе.

Что-то типа

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()
}
person tom redfern    schedule 17.01.2017