2016-05-04 22 views
1

Ich bekomme ein altes Projekt und beginne es für SUT-Zwecke zu refaktorieren. Ich benutze Moq und NUnit Framework. Ich traf nächste Klasse in diesem Projekt:Moq. Mock-System-Klasse

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

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

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

: Ich bin in Unit-Test-Welt, damit ich einen Rat benötigen - wie kann ich extrahieren und Mock System.ServiceController Klasse? Kann es von Moq gemacht werden oder sollte ich andere Mock-Frameworks verwenden?

Antwort

1

Wenn Sie ServiceController verspotten möchten, würde ich es hinter einer Schnittstelle setzen. Zum Beispiel

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 
} 

Dann Dependency Injection (nicht unbedingt mit einer DI-Framework) verwenden Sie es in Ihre ServerRunner Klasse zu erhalten.

+0

Fehlt der Teil der Code-Klasse MyServiceController: IControlServices? Ich habe die Beziehung zwischen der Schnittstelle und der konkreten Klasse nicht verstanden. – Tito

1

Es sieht aus, dass ServiceController nicht leicht Moq Lage Klasse ist, aber Sie können die folgenden immer tun:

  • Wickeln Sie die Funktionen, die Sie von dieser Klasse in eine andere benutzerdefinierte Klasse benötigen (zB ServiceControllerWrapper).
  • Die Schnittstelle extrahieren (IServiceControllerWrapper).
  • Übergeben Sie eine IServiceControllerWrapper Instanz an den Konstruktor und verwenden Sie diese Instanz in der Klasse.
  • Dann können Sie die Klasse testen, die einen Moq der IServiceControllerWrapper Schnittstelle als Parameter an den Konstruktor übergibt.

Es würde wie folgt aussehen:

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

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

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

hoffe, das hilft!

+0

Danke. Habe so eine eigene Idee, also werde ich es versuchen –