起订量。模拟系统 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。
我收到一个旧项目并开始重构它以用于 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。