起订量。模拟系统类

时间:2016-05-04 07:29:45

标签: c# unit-testing tdd 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框架?

2 个答案:

答案 0 :(得分:1)

看来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;
}

希望这有帮助!

答案 1 :(得分:1)

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

for

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