2010-07-15 17 views
3

Je reçois un avertissement d'analyse de code sur certains de mes tests unitaires:Analyse du code d'avertissement CA2000: appeler Dispose sur l'objet 'nouveau ContainerControlledLifetimeManager()'

WidgetManagerTests.cs (40): CA2000: Microsoft .Reliability: Dans la méthode 'WidgetManagerTests.TestInitialize()', appel System.IDisposable.Dispose sur objet 'nouveau ContainerControlledLifetimeManager()' avant que toutes les références à ce sont hors de portée .

J'utilise l'unité et Moq, c'est la ligne incriminée:

var loggingServiceMock = new Mock<ILoggingService>(); 
      this.unityContainer.RegisterInstance<ILoggingService>(loggingServiceMock.Object, new ContainerControlledLifetimeManager()); 

Répondre

8

La mise en œuvre de CA2000 est très sensible aux cas où une exception peut être levée avant une instance à usage unique est « remis off » à une autre méthode. Dans ce cas, même si le conteneur prendra éventuellement soin de nettoyer le gestionnaire de durée de vie si aucune exception ne survient pendant l'enregistrement, il est possible qu'une exception se produise avant l'appel RegisterInstance ou pendant l'appel mais avant que le conteneur ajoute le gestionnaire de durée de vie. propre état interne.

Pour répondre à cette possibilité, vous pouvez utiliser le code comme suit (bien que je ne serais probablement pas pris la peine avec moi-même à moins que la disposition a fait quelque chose d'important):

var loggingServiceMock = new Mock<ILoggingService>(); 

var lifetimeManager = new ContainerControlledLifetimeManager(); 
try 
{ 
    this.unityContainer.RegisterInstance<ILoggingService>(loggingServiceMock.Object, lifetimeManager); 
} 
catch 
{ 
    lifetimeManager.Dispose(); 
    throw; 
} 
+0

Merci, cela fonctionne bien que j'utilisé un utilisant déclaration pour rendre le code un peu plus simple. – tjrobinson

+5

Une instruction using à la place du try/catch ci-dessus entraînera la disposition du gestionnaire de durée de vie même s'il n'y a pas d'exception. Cela n'entraînerait vraisemblablement pas le comportement auquel vous vous attendez lorsqu'aucune exception n'est générée. Avez-vous testé le comportement du code après votre modification? –

+1

@NicoleCalinoiu Qu'en est-il de: * this.unityContainer.RegisterInstance (loggingServiceMock.Object, this.unityContainer.Resolve ()); * – Samuel