web-dev-qa-db-ja.com

Moqで元のメソッドを呼び出す

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());
46
rodbv

モックでCallBaseをtrueに設定します。これにより、元の仮想メソッドまたはプロパティが存在する場合、それらが呼び出され、既定値を返すように設定されていません。

var mock = new Mock<ProductRepository>() { CallBase = true };
72
womp