2012-04-23 3 views
1

単体テストとTDDには新しく、従来のLOBより多くのOSユーティリティが書かれています。だから、私はあなたがデータベースやファイルをモックやスタブかもしれない方法を理解し、どのようにのようなものについて:"telnet"のようなNTサービスをシャットダウンするクラス/メソッドをTDDや単体テストでテストする方法はありますか?

  • NTサービスにADグループ
  • に対する
  • の認可を停止するのActive Directoryに対する認証
  • 等...いくつかのコードでは

答えて

5

ユニットテストを使用してサービスが実際に停止したかどうかはテストできません。これが他のテスト(統合テストなど)のためのものです。テスト中のシステム(SUT)が実際にサービスを停止するための正しい呼び出しを行っているかどうかは、しばしばテストする価値があります。

この場合、具体的なAPIをコンシューマのニーズに合わせてインターフェイス(ファサード)にまとめることができます。そして、そのインタフェースを模擬して、あなたがテストしている消費者が適切な議論をして、適切なメンバーが呼び出されたと主張します。

例(C#、NUnitの、FakeItEasy):あなたは(:IServiceControllerこちら)抽象化を導入することなく、具体的な実装を置き換えるためにできるツールがいくつかの環境で

// implementation of this interface basically wraps the concrete service APIs of the OS 
public interface IServiceController 
{ 
    public void Start(string serviceName); 
    public void Stop(string serviceName); 
}  

// consumer that wants to stop a specific service and that is your SUT 
public class SomeConsumer 
{ 
    // ctor takes dependency on a service controller 
    SomeConsumer(IServiceController controller) 
    { 
     // ... 
    } 

    public void DoSomethingThatRequiresAServiceStop() 
    { 
     // ... 
    } 
} 

[TestFixture] 
public class SomeConsumerTests 
{ 
    [Test] 
    public void DoSomethingThatRequiresAServiceStop_StopsServiceXYZ() 
    { 
      // arrange 
      IServiceController mockServiceConntroler = A.Fake<IServiceController>(); 
      SomeConsumer sut = new SomeConsumer(mockServiceController); 

     // act 
     sut.DoSomethingThatRequiresAServiceStop(); 

     // assert 
     A.CallTo(() => mockServiceConntroler.Stop("XYZ")).MustHaveHappend(); 
    } 
} 

As Matt already pointed out。私はできるだけこれらを避ける傾向があります。なぜなら、それらはしばしば使用するのが面倒であるだけでなく、(例えば抽象ではなく具体的​​な実装に依存して)悪い設計選択を強制するように思われるからです。 Microsoft MolesやTypeMock Isolatorなどのツールは、すぐに取り除くことができない悪い設計の選択肢を既に持っているレガシーコードベースで作業するのに役立ちます(すぐに)。

+0

+1スタブ(Moles、TypeMock)ではなくテスト中のコードを計測するMockingフレームワークです。 –

+0

この例のFakeItEasyの使用法はあまり正確ではありません。 "MustHaveHappened"部分はテストの最後にアサーションとして置くべきです。 MustHaveHappenedはアサーションであり、期待の設定ではありません。 –

+0

@PatrikHägne右、修正されました。 – bitbonk

2

はそれがスタブでユニットテストのために可能ではないかもしれないか、あなたが依存しているコードとして*疎結合な方法で直接を皮肉っそれ自体が疎結合していない可能性があります。代わりに統合テストを書く必要があるかもしれません。

この場合、それは、を良好とすることができる統合テストによって駆動される非ユニットテスト可能なコード上(すなわちadapter又はfacadeパターンを使用する)ラッパークラスを書き込みます。こうすることで、Windowsサービスの開始/停止が必要なときに、単体テストを使用してコード内の別の場所でラッパークラスをスタブ/モックすることができます。ラッパークラスもテスト駆動型ですが、代わりに統合テストを使用するだけです。

* .NETの場合、いくつかのツールを使用してユニットテストを作成し、Microsoft Moles(間もなくFakesという名前)やTypeMock Isolatorなどの擬似オブジェクトを注入することができますテストは遅くなり、より多くのコードを書くことになります。私はMolesを使用していましたが、個人的には、これらのツールを使用する代わりに、難しいテストコードをラップしていました。

関連する問題