Подтвердить что ты не робот

Вызов оригинального метода с помощью Moq

У меня есть ProductRepository с 2 методами, 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());
4b9b3361

Ответ 1

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

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