2010-06-18 19 views
36

Tengo un ProductRepository con 2 métodos, GetAllProducts y GetProductByType, y quiero probar la lógica en GetProductByType. Internamente, GetProductByType realiza una llamada a GetAllProducts y luego filtra los correctos.Llamando al método original con 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(); 
} 

Así que en mi prueba me gustaría burlarse de la llamada a GetAllProducts, por lo que devuelve una lista de los productos definidos en mi prueba, y luego llamar a la GetProductsByType original, que consumirá los GetAllProducts burlado.

Estoy intentando algo así como el código a continuación, pero el GetProductByType original no se ejecuta, también es ridículo. En TypeMock tengo un método CallOriginal que soluciona esto, pero no puedo resolverlo con Moq. ¿Algunas ideas?

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

Me limitaría a subclasificar tu ProductRepository por ti mismo y no simularlo en absoluto. Su "FakeProductRepository" devolvería una lista de productos codificados y usted puede probar GetProductsByType contra esa lista. –

+0

Una gran sugerencia, no he pensado en eso ... ¡Viernes! – rodbv

Respuesta

56

Establezca CallBase en true en su simulacro. Esto llamará a los métodos o propiedades virtuales originales si existen, y no se han configurado para devolver un valor enlatado.

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

Dulce, me estaba volviendo loco intentar esto hoy. Gracias. – PmanAce

Cuestiones relacionadas