Вызов оригинального метода с Moq - PullRequest
43 голосов
/ 19 июня 2010

У меня есть ProductRepository с двумя методами, GetAllProducts и GetProductByType, и я хочу проверить логику в 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, чтобы он возвращал список продуктов, определенных в моем тестеи затем вызовите исходный GetProductsByType, который будет использовать макет GetAllProducts.

Я пытаюсь что-то вроде приведенного ниже кода, но оригинальный 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());

1 Ответ

69 голосов
/ 19 июня 2010

Установите для CallBase значение true на макете. Это вызовет исходные виртуальные методы или свойства, если они существуют, и не были настроены для возврата стандартного значения.

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