我收到一个旧项目,并开始为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;
}
希望这能有所帮助!