単体テストと TDD は初めてで、従来の LOB よりも多くの OS ユーティリティを作成しています。したがって、データベースやファイルをモックまたはスタブ化する方法は理解できますが、次のようなことはどうでしょうか。
- Active Directory に対する認証
- NT サービスの停止
- AD グループに対する認可
- 等...
単体テストと TDD は初めてで、従来の LOB よりも多くの OS ユーティリティを作成しています。したがって、データベースやファイルをモックまたはスタブ化する方法は理解できますが、次のようなことはどうでしょうか。
単体テストを使用してサービスが実際に停止されたかどうかをテストすることはできません。それが、他のテスト (統合テストなど) の目的です。多くの場合、テスト対象のシステム (SUT) が実際にサービスを停止するための適切な呼び出しを行っているかどうかをテストする価値があります。
その場合、これらの具体的な API を、消費者のニーズに合わせて特別に調整されたインターフェイス (ファサード) にラップできます。次に、そのインターフェイスをモックし、適切なメンバーが、テストしているコンシューマーによって適切な引数で呼び出されたことをアサートします。
例 (c#、NUnit、FakeItEasy):
// 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();
}
}
Matt がいくつかの環境ですでに指摘したように、抽象化を導入することなく具体的な実装を置き換えることができるツールです (ここでは: IServiceController
)。これらは、使用するのが少し面倒であるだけでなく、悪い設計選択を強制するように見えることが多いため (たとえば、抽象化ではなく具体的な実装に依存するなど)、これらをできるだけ避ける傾向があります。Microsoft Moles や TypeMock Isolator などのツールは、(すぐに) 取り除くことができない、大量の不適切な設計上の選択肢が既にあるレガシー コード ベースで作業するのに役立つツールであると考えています。
一部のコードでは、依存しているコード自体が疎結合ではない可能性があるため、スタブまたはモックを直接疎結合の方法で単体テストできない場合があります。代わりに統合テストを書く必要があるかもしれません。
この場合、統合テストによって駆動される単体テストが不可能なコードに対して、ラッパー クラスを作成する(つまり、アダプターまたはファサードパターンを使用する) 方がよい場合があります。このようにして、たとえば Windows サービスを開始/停止する必要があるときに、単体テストを使用して、コードの他の場所でラッパー クラスをスタブ/モックすることができます。ラッパー クラスもテスト駆動型ですが、代わりに統合テストのみを使用します。
* .NET の場合、一部のツールではユニット テストを作成し、Microsoft Moles (まもなく Fakes と呼ばれる) や TypeMock Isolator などの何らかの偽のオブジェクトを挿入することができますが、テストは遅くなり、より多くのコードを書く必要があります。Moles を使用したことがありますが、個人的には、これらのツールを使用する代わりに、テストが難しいコードをラップしたいと考えています。