J'ai un objet que j'essaye de me moquer en utilisant moq. Le constructeur de l'objet a des paramètres obligatoires:
public class CustomerSyncEngine {
public CustomerSyncEngine(ILoggingProvider loggingProvider,
ICrmProvider crmProvider,
ICacheProvider cacheProvider) { ... }
}
Maintenant, j'essaie de créer la maquette pour cet objet en utilisant la syntaxe v3 "setup" ou v4 "Mock.Of" de moq mais je n'arrive pas à comprendre cela ... tout ce que j'essaye ne valide pas. Voici ce que j'ai jusqu'à présent, mais la dernière ligne me donne un objet réel, 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 qu'elles sont appelées ...
// 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);
Réponses:
La dernière ligne vous donne une instance réelle parce que vous utilisez le nouveau mot-clé, et non vous moquez de CustomerSyncEngine.
Tu devrais utiliser
Mock.Of<CustomerSyncEngine>()
Le seul problème avec les types Mocking Concrete est que Moq aurait besoin d'un constructeur par défaut public (sans paramètres) OU vous devez créer le Moq avec la spécification arg du constructeur. http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html
La meilleure chose à faire serait de faire un clic droit sur votre classe et de choisir Extraire l'interface.
la source
CustomerSyncEngine
où seules les utilisationsICrmProvider
avec des implémentations de simulation traditionnelles doivent être fournies pour les 3 interfaces, alors qu'un conteneur de verrouillage automatique ne vous permettrait d'en fournir qu'une.Remplacez la dernière ligne par
et ça devrait marcher
la source
new Mock<CustomerSyncEngine>(new object[]{mockLogger, mockCrm, mockCache}).Object;