2016-05-04 117 views
1

我收到一箇舊項目,並開始重構它爲SUT的目的。我使用Moq和NUnit框架。我遇到了這個項目中隔壁班:Moq。模擬系統類

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

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

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

我新的單元測試的世界,所以我需要建議 - 我怎麼能提取和模擬System.ServiceController類?它可以由Moq完成,或者我應該使用其他一些模擬框架?

回答

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能類,但你總是可以做到以下幾點:

  • 總結你從該類需要到另一個自定義類的功能(比如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; 
} 

希望這有助於!

+0

謝謝。有這樣的想法,所以我會嘗試它 –