私が過去に読んだように、各用語が何を表していると私が信じているかを以下に示します。
スタブ
ここでは、問題なくコードを実行できるようにするために、メソッドの結果を既知の値にスタブしています。たとえば、次のものがあったとします。
public int CalculateDiskSize(string networkShareName)
{
// This method does things on a network drive.
}
このメソッドの戻り値が何であるかは気にしません。それは関係ありません。さらに、ネットワーク ドライブが使用できない場合に実行すると、例外が発生する可能性があります。したがって、メソッドの潜在的な実行の問題を回避するために、結果をスタブします。
だからあなたは次のようなことをすることになります:
sut.WhenCalled(() => sut.CalculateDiskSize()).Returns(10);
偽
偽物を使用すると、偽のデータを返すか、オブジェクトの偽のインスタンスを作成します。古典的な例は、リポジトリ クラスです。この方法を取ります:
public int CalculateTotalSalary(IList<Employee> employees) { }
通常、上記のメソッドには、データベースから読み取られた従業員のコレクションが渡されます。ただし、単体テストでは、データベースにアクセスしたくありません。したがって、偽の従業員リストを作成します。
IList<Employee> fakeEmployees = new List<Employee>();
その後、項目を fakeEmployees に追加して、期待される結果 (この場合は総給与) をアサートできます。
モック
モック オブジェクトを使用する場合、それらのモック オブジェクトの動作またはデータを検証するつもりです。例:
テスト実行中に特定のメソッドが実行されたことを確認したい場合は、Moq モック フレームワークを使用した一般的な例を次に示します。
public void Test()
{
// Arrange.
var mock = new Mock<ISomething>();
mock.Expect(m => m.MethodToCheckIfCalled()).Verifiable();
var sut = new ThingToTest();
// Act.
sut.DoSomething(mock.Object);
// Assert
mock.Verify(m => m.MethodToCheckIfCalled());
}
上記が物事を少し明確にするのに役立つことを願っています。
編集: Roy Osherove は、テスト駆動開発の支持者としてよく知られており、このトピックに関する非常に優れた情報を提供しています。あなたはそれが非常に便利だと思うかもしれません:
http://artofunittesting.com/