unit-testing
テストダブルス
サーチ…
備考
テスト時には、テスト中のシステムの動作を操作または検証するためにテストダブルを使用すると便利なことがあります。ダブルスは、プロダクションコードのインスタンスではなく、テスト対象のクラスまたはメソッドに渡されるか、 注入されます。
スタブを使用して缶入りの回答を提供する
スタブは、メソッドが呼び出されたときに缶入りの応答を提供する軽量テストのダブルです。テスト対象のクラスがインタフェースまたはベースクラスに依存する場合、そのインタフェースに適合するテストのために代替の「スタブ」クラスを実装できます。
したがって、以下のインターフェースを仮定すると、
public interface IRecordProvider {
IEnumerable<Record> GetRecords();
}
以下の方法をテストする場合
public bool ProcessRecord(IRecordProvider provider)
インタフェースを実装するスタブクラスは、既知のデータをテスト対象のメソッドに返すように記述できます。
public class RecordProviderStub : IRecordProvider
{
public IEnumerable<Record> GetRecords()
{
return new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
};
}
}
このスタブインプリメンテーションはテスト中のシステムに提供され、その動作に影響を与えます。
var stub = new RecordProviderStub();
var processed = sut.ProcessRecord(stub);
模擬フレームワークをスタブとして使用する
モック(Mock)とスタブ(Stub)という用語は、しばしば混乱することがあります。この理由の1つは、多くのモッキングフレームワークが、モッキングに関連する検証ステップなしでスタブを作成するためのサポートも提供するということです。
スタブを実装するための新しいクラスを作成するのではなく、「スタンプを使用して缶詰の応答を提供する」の例のように、モックフレームワークを代わりに使用することができます。
Moqを使う:
var stub = new Mock<IRecordProvider>();
stub.Setup(provider => provider.GetRecords()).Returns(new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
});
これにより、手でコード化されたスタブと同じ動作が実現され、同様の方法でテスト中のシステムに供給することができます。
var processed = sut.ProcessRecord(stub.Object);
動作を検証するための模擬フレームワークの使用
モックは、テスト中のシステムとテストダブルとの間の相互作用を検証する必要がある場合に使用されます。過度に壊れやすいテストを避けるために注意を払う必要がありますが、テストする方法が他のコールを編成するだけの場合は、模擬は特に役立ちます。
このテストでは、テスト対象のメソッドが呼び出されると( ProcessRecord
)、 Flag==true
Record
に対してサービスメソッド( UseValue
)が呼び出されることをUseValue
Flag==true
。これを行うには、データを含むスタブを設定します。
var stub = new Mock<IRecordProvider>();
stub.Setup(provider => provider.GetRecords()).Returns(new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
});
次に、 IService
インターフェイスを実装するモックを設定します。
var mockService = new Mock<IService>();
mockService.Setup(service => service.UseValue(It.IsAny<string>())).Returns(true);
これらはテスト中のシステムに供給され、テストされるメソッドが呼び出されます。
var sut = new SystemUnderTest(mockService.Object);
var processed = sut.ProcessRecord(stub.Object);
モックはそれから、予想されるコールが行われたことを確認するために質問することができます。この場合、 Flag==true
レコードの値である1つのパラメータ "Second"を持つUseValue
呼び出し。
mockService.Verify(service => service.UseValue("Second"));