Moquer des objects avec Moq lorsque le constructeur a des parameters

J’ai un object que j’essaie de me moquer en utilisant moq. Le constructeur de l’object a les parameters requirejs:

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

Maintenant, j’essaie de créer le simulacre pour cet object en utilisant la syntaxe “setup” ou v4 “Mock.Of” de moq v3, mais je n’arrive pas à le comprendre … tout ce que j’essaie n’est pas en cours de validation. Voici ce que j’ai à ce jour, mais la dernière ligne me donne un véritable object, pas le simulacre. La raison pour laquelle je fais cela est parce que j’ai des méthodes sur le CustomerSyncEngine que je veux vérifier sont appelées …

 // setup var mockCrm = Mock.Of(x => x.GetPickLists() == crmPickLists); var mockCache = Mock.Of(x => x.GetPickLists() == cachePickLists); var mockLogger = Mock.Of(); // need to mock the following, not create a real class like this... var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm, mockCache); 

La dernière ligne vous donne une véritable instance car vous utilisez le nouveau mot-clé, sans vous moquer de CustomerSyncEngine.

Vous devez utiliser Mock.Of()

Le seul problème avec les types de Mocking Concrete est que Moq aurait besoin d’un constructeur public par défaut (sans parameters) OU vous devez créer la spécification Moq avec constructeur. http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

La meilleure chose à faire serait de cliquer avec le bouton droit sur votre classe et de choisir l’interface d’extraction.

Changer la dernière ligne à

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

et ça devrait marcher