2010-06-18 4 views
36

Mam ProductRepository z 2 metodami, GetAllProducts i GetProductByType i chcę przetestować logikę w GetProductByType. Wewnętrznie GetProductByType wywołuje GetAllProducts, a następnie filtruje prawidłowe.Wywoływanie oryginalnej metody za pomocą Moq

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(); 
} 

Więc w moim teście chciałbym mock wywołanie GetAllProducts, więc zwraca listę produktów określonych w moim teście, a następnie połączyć się z oryginalną GetProductsByType, które zużywają szydzili GetAllProducts.

Próbuję coś podobnego do poniższego kodu, ale oryginalny GetProductByType nie jest wykonywany, jest również wyszydzony, jak również. W TypeMock używam metody CallOriginal, która to naprawia, ale nie mogę tego obliczyć za pomocą Moq. Jakieś pomysły?

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()); 
+2

Chciałbym po prostu podklasy ProductRepository samodzielnie, a nie makiety w ogóle. Twój "FakeProductRepository" zwróci listę produktów zakodowanych na sztywno i możesz przetestować GetProductsByType na tej liście. –

+0

Świetna propozycja, nie pomyślałam o tym ... Piątki! – rodbv

Odpowiedz

56

Ustaw CallBase na wartość true w swoim symulatorze. Spowoduje to wywołanie oryginalnych wirtualnych metod lub właściwości, jeśli istnieją i nie zostały skonfigurowane w celu zwrócenia wartości w puszkach.

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

Słodko, szaleje, próbując zrobić to dzisiaj. Dzięki. – PmanAce