GetAllProductsとGetProductByTypeの2つのメソッドを持つProductRepositoryがあり、GetProductByTypeでロジックをテストしたいと思います。内部的には、GetProductByTypeはGetAllProductsを呼び出してから、正しいものをフィルタリングします。
public virtual IEnumerable<Product> GetAllProducts()
{
//returns all products in memory, db etc
}
public virtual IEnumerable<Product> GetProductsByType(string type)
{
return (from p in GetAllProducts() where p.Type == type select p).ToList();
}
したがって、私のテストでは、GetAllProductsへの呼び出しをモック化して、テストで定義された製品のリストを返し、モックされたGetAllProductsを使用する元のGetProductsByTypeを呼び出します。
以下のコードのようなものを試していますが、元のGetProductByTypeは実行されず、モックアウトされています。 TypeMockにはこれを修正するCallOriginalメソッドがありますが、Moqではそれを理解できません。何か案は?
var mock = new Mock<ProductRepository>();
mock.Setup(r => r.GetAllProducts()).Returns(new List<Product>() {p1, p2, p3});
var result = mock.Object.GetProductsByType("Type1");
Assert.AreEqual(2, result.Count());
モックでCallBaseをtrueに設定します。これにより、元の仮想メソッドまたはプロパティが存在する場合、それらが呼び出され、既定値を返すように設定されていません。
var mock = new Mock<ProductRepository>() { CallBase = true };