2016-05-04 10 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でそれを行うことはできますか、他の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ことができ、クラスではないことに見えますが、あなたは常に次の操作を行うことができます。

  • ラップあなたが別のカスタムクラスに、そのクラスから必要な機能(ServiceControllerWrapperを言います)。
  • インターフェイス(IServiceControllerWrapper)を抽出します。
  • IServiceControllerWrapperインスタンスをコンストラクタServerRunnerに渡して、そのクラスのインスタンスを使用します。
  • IServiceControllerWrapperインターフェイスのMoqをコンストラクタのパラメータとして渡して、ServerRunnerクラスをテストできます。

それは次のようになります。

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

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

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

は、この情報がお役に立てば幸い!

+0

ありがとうございました。独自のアイデアがあるので、試してみます –