Moqテスト基礎説談(一)——概要、ダウンロード
2420 ワード
Moq、Mock youです.読み方はMock~youと読むことができます.Mockフレームの一種です.テスト中のMockテストに使用します.Mockはシミュレーションの意味です.Mockはオブジェクトをシミュレートする技術です.
次の場合に使用できます(参照).
------実際のオブジェクトに不確定な行為がある(株の相場などの予測不可能な結果が生じる)
------実際のオブジェクトは作成しにくい(具体的なWebコンテナなど)
------実際のオブジェクトの動作によっては、ネットワークエラーなどのトリガが発生しにくい場合があります.
------プログラムの実行速度が遅い
------リアルオブジェクトにはユーザーインタフェースがあります
---テストでは、実際のオブジェクトがどのように呼び出されたかを尋ねる必要があります(たとえば、テストでコールバック関数が呼び出されたかどうかを検証する必要がある場合があります)
------実際のオブジェクトは存在しません(他の開発チームや新しいハードウェアシステムと付き合う必要がある場合、これは一般的な問題です).
明らかな例を挙げると、BSネットショップシステムを開発する際に、データ層にあまり時間をかけたくなく、ビジネスロジック部分の開発に集中したい場合、Mockオブジェクトを通じてデータ層をシミュレートすることができ、データ接続、CRUD、Mappingなどのために多くのことをする必要がなく、ビジネステストを行うことができます.
ダウンロード先:
http://code.google.com/p/moq/
ここにはいくつかのドキュメントの説明があります.
インタフェースと存在するクラスをシミュレートできます.クラスのシミュレーションにはいくつかの制限があります.クラスは密封できません.メソッドにはダミー修飾子を付けます.静的メソッドをシミュレートできません(アダプタモードで静的メソッドをシミュレートできます).
下は小さな例です
準備:
テスト
次のようになります.
ここでは、Mockオブジェクトを作成します.
ここではGetTax法を実際にシミュレーションした.
GetTax(25.0M){return 5.0M;}
myProductを呼び出すとGetPriceWithTax(fakeTaxCalculator.Object)の場合、
return calculator.GetTax(RawPrice) + RawPrice;
これでcalculatorオブジェクトがシミュレーションされ、GetPriceWithTaxはGetTaxの値+RawPriceの値を返します.
このときのProductのRawPriceの値は25.0 Mである、この値からtaxを得ることができる.GetTax(25.0 M)の値は5.0 Mである.一方、25.0 M+5.0 Mの値は30.0 Mである.したがって、返される値は30.0 Mです.この断言は正しい.
次の場合に使用できます(参照).
------実際のオブジェクトに不確定な行為がある(株の相場などの予測不可能な結果が生じる)
------実際のオブジェクトは作成しにくい(具体的なWebコンテナなど)
------実際のオブジェクトの動作によっては、ネットワークエラーなどのトリガが発生しにくい場合があります.
------プログラムの実行速度が遅い
------リアルオブジェクトにはユーザーインタフェースがあります
---テストでは、実際のオブジェクトがどのように呼び出されたかを尋ねる必要があります(たとえば、テストでコールバック関数が呼び出されたかどうかを検証する必要がある場合があります)
------実際のオブジェクトは存在しません(他の開発チームや新しいハードウェアシステムと付き合う必要がある場合、これは一般的な問題です).
明らかな例を挙げると、BSネットショップシステムを開発する際に、データ層にあまり時間をかけたくなく、ビジネスロジック部分の開発に集中したい場合、Mockオブジェクトを通じてデータ層をシミュレートすることができ、データ接続、CRUD、Mappingなどのために多くのことをする必要がなく、ビジネステストを行うことができます.
ダウンロード先:
http://code.google.com/p/moq/
ここにはいくつかのドキュメントの説明があります.
インタフェースと存在するクラスをシミュレートできます.クラスのシミュレーションにはいくつかの制限があります.クラスは密封できません.メソッドにはダミー修飾子を付けます.静的メソッドをシミュレートできません(アダプタモードで静的メソッドをシミュレートできます).
下は小さな例です
準備:
public interface ITaxCalculator
{
decimal GetTax(decimal rawPrice);
}
public class Product
{
public int ID { get; set; }
public String Name { get; set; }
public decimal RawPrice { get; set; }
public decimal GetPriceWithTax(ITaxCalculator calculator)
{
return calculator.GetTax(RawPrice) + RawPrice;
}
}
テスト
public void TestTax()
{
Product myProduct = new Product { ID = 1, Name = "TV", RawPrice = 25.0M };
Mock<ITaxCalculator> fakeTaxCalculator = new Mock<ITaxCalculator>();
fakeTaxCalculator.Setup(tax => tax.GetTax(25.0M)).Returns(5.0M);
decimal calculatedTax = myProduct.GetPriceWithTax(fakeTaxCalculator.Object);
fakeTaxCalculator.Verify(tax => tax.GetTax(25.0M));
Assert.AreEqual(calculatedTax, 30.0M);
}
次のようになります.
Mock<ITaxCalculator> fakeTaxCalculator = new Mock<ITaxCalculator>();
fakeTaxCalculator.Setup(tax => tax.GetTax(25.0M)).Returns(5.0M);
ここでは、Mockオブジェクトを作成します.
ここではGetTax法を実際にシミュレーションした.
GetTax(25.0M){return 5.0M;}
myProductを呼び出すとGetPriceWithTax(fakeTaxCalculator.Object)の場合、
return calculator.GetTax(RawPrice) + RawPrice;
これでcalculatorオブジェクトがシミュレーションされ、GetPriceWithTaxはGetTaxの値+RawPriceの値を返します.
このときのProductのRawPriceの値は25.0 Mである、この値からtaxを得ることができる.GetTax(25.0 M)の値は5.0 Mである.一方、25.0 M+5.0 Mの値は30.0 Mである.したがって、返される値は30.0 Mです.この断言は正しい.