J'utilise Moq depuis environ une semaine et je n'ai eu aucun problème jusqu'à aujourd'hui. J'ai un problème avec obtenir VerifyAll()
pour correspondre correctement à la configuration de ma maquette.Problème avec la configuration correspondante dans Moq
J'écris actuellement des tests unitaires pour l'API de mon application. Voilà comment l'application est structuré:
API <==> Service <==> DAO <==> Database
Dans cet esprit, je suis moqueur l'objet de service, puis la construction d'un objet API à l'aide du service moqué. J'ai déjà écrit un certain nombre de tests unitaires sans problème jusqu'à maintenant.
J'ai deux variables d'instance comme celle-ci:
private Api _api;
private Mock<IHibernateService> mockService;
J'initialiser ces derniers dans une méthode de configuration:
[SetUp]
public void DoSetupTasks()
{
mockService = new Mock<IHibernateService>();
_api = new Api(mockService.Object);
}
Voici le test unitaire qui échoue:
[Test]
public void TestSearchOnAllProperties()
{
mockService
.Setup(service => service.LoadAll(It.IsAny<Type>()))
.Returns(new DomainBase[0]);
var dmbs = _api.SearchOnAllProperties("search term", typeof(DomainBase));
mockService.VerifyAll();
}
La méthode SearchOnAllProperties()
de l'API appelle ensuite le service LoadAll()
méthode (avec une logique supplémentaire bien sûr), donc je veux vérifier qu'il est appelé correctement. Pour clarifier, voici comment LoadAll()
est appelé à SearchOnAllProperties()
:
public IEnumerable<DomainBase> SearchOnAllProperties(string searchTerm, Type type)
{
foreach (DomainBase dmb in _hibernateService.LoadAll(type))
{
// additional logic
}
}
Cependant, quand je lance le test unitaire, je reçois un MockVerificationException
indiquant qui n'a pas été correspondait à la configuration donnée. Je ne peux pas comprendre pourquoi comme il devrait appeler la méthode LoadAll()
du service.
Je aurais dû préciser que j'ai essayé d'initialiser mockService et _api localement dans le scénario de test et le problème persiste toujours. –
@Tyler, j'ai copié votre code et il est passé, donc ça ne devrait pas poser de problème avec Moq. Votre classe 'Api' fait-elle quelque chose qui pourrait affecter sa variable interne' IHibernateService' à une nouvelle instance? –
Il semble que ce soit un problème lorsque l'appel de méthode en cours de correspondance fait partie d'une autre expression, comme: 'foreach (Type t dans _hibernateService.GetAllDomainTypes(). Où (t => t.BaseType! = Null && t.BaseType.Name == "DomainBase" &&! T.IsAbstract) '. J'ai mis le mock à strict, mais il n'y a pas d'exception, il semble qu'aucune méthode ne soit appelée du tout. –