Ich habe ein Objekt, das ich mit moq verspotten möchte. Der Konstruktor des Objekts hat folgende Parameter:
public class CustomerSyncEngine {
public CustomerSyncEngine(ILoggingProvider loggingProvider,
ICrmProvider crmProvider,
ICacheProvider cacheProvider) { ... }
}
Jetzt versuche ich, den Mock für dieses Objekt entweder mit der v3 "setup" - oder der v4 "Mock.Of" -Syntax von moq zu erstellen, kann dies aber nicht herausfinden ... alles, was ich versuche, wird nicht validiert. Folgendes habe ich bisher, aber die letzte Zeile gibt mir ein echtes Objekt, nicht den Schein. Der Grund, warum ich das mache, ist, dass ich Methoden in der CustomerSyncEngine habe, deren Überprüfung ich aufrufen möchte ...
// 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);
Antworten:
In der letzten Zeile erhalten Sie eine echte Instanz, da Sie das neue Schlüsselwort verwenden und CustomerSyncEngine nicht verspotten.
Du solltest benutzen
Mock.Of<CustomerSyncEngine>()
Das einzige Problem bei Mocking Concrete-Typen besteht darin, dass Moq einen öffentlichen Standardkonstruktor (ohne Parameter) benötigt oder dass Sie den Moq mit der Konstruktor-Arg-Spezifikation erstellen müssen. http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html
Am besten klicken Sie mit der rechten Maustaste auf Ihre Klasse und wählen Sie Schnittstelle extrahieren.
quelle
CustomerSyncEngine
der nur die VerwendungICrmProvider
mit herkömmlichen Verspottungsimplementierungen für alle drei Schnittstellen bereitgestellt werden muss, während Sie mit einem Autmocking-Container nur eine bereitstellen können.Ändern Sie die letzte Zeile in
und es sollte funktionieren
quelle
new Mock<CustomerSyncEngine>(new object[]{mockLogger, mockCrm, mockCache}).Object;