Unit testing 如何";跳过“;虚空法和假货法?

Unit testing 如何";跳过“;虚空法和假货法?,unit-testing,serilog,fakeiteasy,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() {

我在一个正在进行单元测试的方法中使用了这段代码

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..
}
公共无效测试()
{
var logger=A.Fake();
A.CallTo(()=>logger.ConfigLogger()).DoesNothing();//不工作。。
}

所以我在这里遗漏了什么?为什么我认为这应该是这样的?尽管Serilog专家给了我一个更好的方法来测试Serilog,但我也想知道如何“伪造一个无效的方法”

使用的模式是:

  • 创建生产代码将用作合作者的伪代码
  • 配置假文件
  • 向测试中的生产类实例提供假代码
  • 执行生产代码
  • 有选择地审问假货

  • 由于您的生产代码现在已经编写完毕,因此没有机会注入协作者—它创建自己的协作者(
    log
    )。为了避免调用
    Logger
    方法,您需要提供一种方法来插入替代的
    IMyLogger

    您应该避免在方法中实例化和配置记录器

    差不多

    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()
    }
    
    公共无效测试()
    {
    var logger=A.Fake();
    var someClass=新的someClass(记录器);
    //测试someClass.SomeMethod()
    }