Tengo un objeto que estoy tratando de simular usando moq. El constructor del objeto tiene parámetros obligatorios:
public class CustomerSyncEngine {
public CustomerSyncEngine(ILoggingProvider loggingProvider,
ICrmProvider crmProvider,
ICacheProvider cacheProvider) { ... }
}
Ahora estoy tratando de crear el simulacro para este objeto usando la sintaxis de moq v3 "setup" o v4 "Mock.Of" pero no puedo resolver esto ... todo lo que estoy intentando no está validando. Esto es lo que tengo hasta ahora, pero la última línea me da un objeto real, no la simulación. La razón por la que hago esto es porque tengo métodos en CustomerSyncEngine que quiero verificar que se están llamando ...
// setup
var mockCrm = Mock.Of<ICrmProvider>(x => x.GetPickLists() == crmPickLists);
var mockCache = Mock.Of<ICacheProvider>(x => x.GetPickLists() == cachePickLists);
var mockLogger = Mock.Of<ILoggingProvider>();
// need to mock the following, not create a real class like this...
var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm, mockCache);
Respuestas:
La última línea le da una instancia real porque está usando la nueva palabra clave, no burlándose de CustomerSyncEngine.
Deberías usar
Mock.Of<CustomerSyncEngine>()
El único problema con los tipos de Mocking Concrete es que Moq necesitaría un constructor público predeterminado (sin parámetros) O necesita crear el Moq con la especificación arg del constructor. http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html
Lo mejor que puede hacer es hacer clic derecho en su clase y elegir Extraer interfaz.
fuente
CustomerSyncEngine
que solo seICrmProvider
deben proporcionar los usos con implementaciones de simulación tradicionales para las 3 interfaces, mientras que un contenedor de simulación automática le permitiría proporcionar solo una.Cambie la última línea a
y debería funcionar
fuente
new Mock<CustomerSyncEngine>(new object[]{mockLogger, mockCrm, mockCache}).Object;