2010-12-13 50 views
2

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.

Répondre

0

Une cause possible est que, avant que cette méthode de test particulière soit appelée, mockService est affectée à une nouvelle instance de Mock<IHibernateService>. Si tel est le cas, alors cette méthode de test appelait Setup sur la mauvaise instance, ce qui produirait alors cette exception.

Un moyen rapide de tester ce serait d'utiliser mockService locaux et api les variables et voir si le test échoue encore:

[Test] 
public void TestSearchOnAllProperties() 
{ 
    var localMockService = new Mock<IHibernateService>(); 
    var localApi = new Api(localMockService.Object); 

    localMockService 
     .Setup(service => service.LoadAll(It.IsAny<Type>())) 
     .Returns(new DomainBase[0]); 

    var dmbs = localApi.SearchOnAllProperties("search term", typeof(DomainBase)); 

    localMockService.VerifyAll(); 
} 

HTH

+0

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. –

+0

@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? –

+0

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. –