2010-10-13 15 views
0

J'ai récemment embarqué sur le train Moles Pex & afin de tester une logique avec de nombreux éléments qui sont statiques, non-virtuels, scellés, etc. Récemment, j'ai commencé à voir un comportement que je ne peux pas expliquer les tests.Pourquoi un assertif sur un test unitaire avec HostType ("Moles") passe-t-il lorsqu'il est exécuté individuellement, mais échoue lorsqu'il est exécuté avec un groupe de tests?

Un couple de méthodes pour une interface que j'ai extensible renvoyer void, donc j'ai défini les stubs aux délégués qui mettent à jour les variables booléennes pour indiquer qu'ils ont été appelés. Voici ce que je fais:

[TestMethod] 
[HostType("Moles")] 
    public void UnitTestX() 
    { 
     bool disposeCalled = false; 
     bool getCalled = false; 

     ClassX classX = new ClassX(); 
     var data = new SIClassXData 
         { 
          Dispose =() => disposeCalled = true, 
          Get =() => getCalled = true, 
          ClassXGet =() => classX 
         }; 

     MDataLayerFactory.CreateDataLayerObject(() => (IClassXData)data); 

     Assert.IsTrue(disposeCalled); 
     Assert.IsTrue(getCalled); 
    } 

Pour une raison quelconque, l'affirme réussir ci-dessus si je lance ce test seul. Mais si j'exécute le test avec tous les autres tests de l'assembly (en utilisant la fonctionnalité "Exécuter tous les tests dans la solution" de Visual Studio), la première assertion échoue. Je voudrais savoir pourquoi cela se produit et ce que j'ai besoin de changer pour résoudre le problème.

+0

DataLayerFactory est un service statefull? Dans ce cas, le scénario de test peut orienter le système vers un état où il échoue, mais il n'échoue pas isolément. – Peli

+0

@Peli DataLayerFactory est une classe statique ne contenant rien qui puisse contenir l'état. –

+0

FYI - en général, nous ne suivons pas activement les questions/réponses de stackoverflow sur Pex/Moles (peut-être devrions-nous mais nous ne le faisons pas pour le moment) – Peli

Répondre

1

Est-ce que cela pourrait simplement être un effet secondaire de «lancer tous les tests» en utilisant plusieurs threads pour exécuter les tests? Donc, que Dispose() n'a pas fonctionné au moment où le Assert se déclenche? Essayez-vous d'utiliser ManualResetEvent pour bloquer la méthode de test jusqu'à ce que Dispose() soit exécuté? Quelque chose comme;

public void UnitTestX() 
{ 
    // use this to block the test thread until Dispose() is run 
    ManualResetEvent mre = new ManualResetEvent(false); 

    bool disposeCalled = false; 
    bool getCalled = false; 

    ClassX classX = new ClassX(); 
    var data = new SIClassXData 
        { 
         Dispose =() => { 
          disposeCalled = true; 
          mre.Set(); // release the test thread now 
         }, 
         Get =() => getCalled = true, 
         ClassXGet =() => classX 
        }; 

    MDataLayerFactory.CreateDataLayerObject(() => (IClassXData)data); 

    Assert.IsTrue(mre.WaitOne(1000)); // give it a second to fire 
    Assert.IsTrue(disposeCalled); 
    Assert.IsTrue(getCalled); 
}