2016-05-04 3 views
1

Получаю старый проект и начинаю реорганизовывать его для целей SUT. Я использую рамки Moq и NUnit. Я встретил следующий класс в этом проекте:Moq. Mock system class

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

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

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

Я новичок в единичном тестовом мире, так что я нужен совет - как я могу извлечь и фиктивный класс System.ServiceController? Могу ли это сделать Мок или я должен использовать некоторые другие рамки Mock?

ответ

1

Если вы хотите высмеять 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.

+0

Не хватает ли части класса кода MyServiceController: IControlServices? Я не понял отношения между интерфейсом и конкретным классом. – Tito

1

Похоже, что ServiceController не легко Moq состоянии класса, но вы всегда можете сделать следующее:

  • Wrap функциональность вам нужно от этого класса в другой пользовательский класс (скажем ServiceControllerWrapper).
  • Извлечь интерфейс (IServiceControllerWrapper).
  • Передайте экземпляр IServiceControllerWrapper конструктору ServerRunner и используйте этот экземпляр в классе.
  • Затем вы можете проверить класс ServerRunner, передавая Moq интерфейса IServiceControllerWrapper в качестве параметра конструктору.

Это будет выглядеть следующим образом:

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

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

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

Надеется, что это помогает!

+0

Спасибо. Имейте такую ​​собственную идею, поэтому я попробую это –

Смежные вопросы