Moq.模拟系统类



我收到一个旧项目,并开始为SUT目的对其进行重构。我使用Moq和NUnit框架。我在这个项目中遇到了下一个班:

public ServerRunner()
{
    Name = ConfigurationManager.AppSettings["ServiceName"];
    WinService = new ServiceController(Name);
    logger = new Logger.Logger(Name);
    syncRoot = new ReaderWriterLockSlim();
    timeoutMilliseconds = 10000;
}

我是单元测试领域的新手,所以我需要建议——我如何提取和模拟System.ServiceController类?它可以由Moq完成吗?或者我应该使用其他Mock框架?

如果你想模拟ServiceController,我会把它放在接口后面。例如,

interface IControlServices {
  // ... methods you want to implement
}
class MyServiceController {
  private ServiceController _serviceController;
  public MyServiceController(ServiceController servicecontroller){
    _serviceController = servicecontroller;
  }
  // ... methods you want to implement from interface
}

然后使用依赖注入(不一定使用DI框架)将其放入ServerRunner类中。

看起来ServiceController不是一个容易Moq的类,但您可以始终执行以下操作:

  • 将该类中所需的功能封装到另一个自定义类中(比如ServiceControllerWrapper
  • 提取接口(IServiceControllerWrapper
  • 将一个IServiceControllerWrapper实例传递给ServerRunner的构造函数,并在类中使用该实例
  • 然后可以测试ServerRunner类,该类将IServiceControllerWrapper接口的Moq作为参数传递给构造函数

它看起来是这样的:

public ServerRunner(IServiceControllerWrapper controllerInstance)
{
    Name = ConfigurationManager.AppSettings["ServiceName"];
    WinService = controllerInstance;
    logger = new Logger.Logger(Name);
    syncRoot = new ReaderWriterLockSlim();
    timeoutMilliseconds = 10000;
}

希望这能有所帮助!

最新更新