如何用FakeItEasy“跳过”void方法?

时间:2017-01-17 14:27:15

标签: unit-testing serilog 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 a void method”。

2 个答案:

答案 0 :(得分:1)

您的生产代码仍在使用Logger的具体实例。除了FakeItEasy创造的假货之外,FakeItEasy不会影响任何行为。

使用模式是:

  1. 创建您的生产代码将用作协作者的假冒
  2. 配置假冒
  3. 将假提供给正在测试的生产类的实例
  4. 执行生产代码
  5. 可选择询问Fake
  6. 由于您的生产代码现在已经编写,因此没有机会注入协作者 - 它会创建自己的协作者(log)。为了避免调用Logger方法,您需要提供一种方法来注入替代IMyLogger

答案 1 :(得分: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()
}