起订量。模拟系统 class

Moq. Mock system class

我收到一个旧项目并开始重构它以用于 SUT。我使用 Moq 和 NUnit 框架。我在这个项目中遇到了下一个 class:

public ServerRunner()
{
    Name = ConfigurationManager.AppSettings["ServiceName"];

    WinService = new ServiceController(Name);
    logger = new Logger.Logger(Name);

    syncRoot = new ReaderWriterLockSlim();
    timeoutMilliseconds = 10000;
}

我是单元测试领域的新手,所以我需要建议 - 如何提取和模拟 System.ServiceController class?可以通过 Moq 完成还是我应该使用其他 Mock 框架?

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

  • 将您需要的功能从 class 包装到另一个自定义 class(例如 ServiceControllerWrapper)。
  • 提取界面(IServiceControllerWrapper)。
  • IServiceControllerWrapper 实例传递给 ServerRunner 的构造函数并在 class.
  • 中使用该实例
  • 然后你可以测试 ServerRunner class 将 IServiceControllerWrapper 接口的 Moq 作为参数传递给构造函数。

看起来像这样:

public ServerRunner(IServiceControllerWrapper controllerInstance)
{
    Name = ConfigurationManager.AppSettings["ServiceName"];

    WinService = controllerInstance;
    logger = new Logger.Logger(Name);

    syncRoot = new ReaderWriterLockSlim();
    timeoutMilliseconds = 10000;
}

希望对您有所帮助!

如果你想模拟 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 class。