it-swarm.it

Deridere oggetti con Moq quando il costruttore ha parametri

Ho un oggetto che sto cercando di deridere usando moq. Il costruttore dell'oggetto ha richiesto i parametri:

public class CustomerSyncEngine {
    public CustomerSyncEngine(ILoggingProvider loggingProvider, 
                              ICrmProvider crmProvider, 
                              ICacheProvider cacheProvider) { ... }
}

Ora sto provando a creare il mock per questo oggetto usando la sintassi "setup" di v3 "setup" o v4 "Mock.Of" di moq ma non riesco a capirlo ... tutto quello che sto provando non sta convalidando. Ecco quello che ho finora, ma l'ultima riga mi sta dando un oggetto reale, non la finta. Il motivo per cui sto facendo questo è perché ho metodi sul CustomerSyncEngine che voglio verificare vengono chiamati ...

// 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);
82
Andrew Connell

L'ultima riga ti fornisce un'istanza reale perché stai usando la nuova parola chiave, non deridendo CustomerSyncEngine.

Dovresti usare Mock.Of<CustomerSyncEngine>()

L'unico problema con i tipi di Mocking Concrete è che Moq avrebbe bisogno di un costruttore predefinito pubblico (senza parametri) OR è necessario creare il Moq con la specifica arg del costruttore. http: // www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

La cosa migliore da fare sarebbe fare clic con il tasto destro sulla tua classe e scegliere Estrai interfaccia.

31
Raghu

Cambia l'ultima riga in

var syncEngine = new Mock<CustomerSyncEngine>(mockLogger, mockCrm, mockCache).Object;

e dovrebbe funzionare

58
Suhas