2009-08-12 4 views
0

Toy exemple de code:Les constructeurs de classe de test ne s'exécutent pas lors de l'exécution d'une théorie xUnit individuellement?

public abstract class testBase 
{ 
    public testBase() 
    { 
    //Some common test setup code, which will initialize ManagerClass 
    } 
} 

public class someTests: testBase 
{ 
    public someTests() 
    { 
    //someTests-specific constructor code. 
    } 

    [Theory] 
    [PropertyData("MyTestData")] 
    public void test1(Foo foo) 
    { 
    //Use foo to do a test 
    } 

    public static IEnumerable<object[]> MyTestData 
    { 
    get 
    { 
     yield return new object[] { ManagerClass.CreateANewFoo(1) }; 
     yield return new object[] { ManagerClass.CreateANewFoo(42) }; 
    } 
    } 
} 

Dans l'exemple ci-dessus, si je lance spécifiquement test1 (j'utilise ReSharper, mais le problème se produit également lors de l'utilisation de l'interface graphique xUnit) mon test échoue car il semble que ni les constructeurs testBase ni someTests ne sont en cours d'exécution. D'où l'appel à ManagerClass.CreateANewFoo() lance un NullReference.

Si j'exécute tous les tests dans someTests, ou tout autre test individuel, le constructeur s'exécute comme prévu et les tests se déroulent comme prévu. La seule chose qui marque test1 comme différent est le fait qu'il utilise l'attribut PropertyData.

Des idées pourquoi cela se passe-t-il/ce que je fais mal?

+0

Avis de non-responsabilité: n'utilisez pas xUnit.net. Avez-vous essayé de mettre des instructions Console.WriteLine/trace dans les ctors? Etes-vous sûr que le ctor n'est pas appelé .. parce que je ne vois pas comment il peut exécuter un test sans créer une instance de la fixture/class de test. Cela me semble être un bug si le test Run All Tests/Run One Test produit des résultats de test différents. Essayez: Si les agents sont touchés, essayez d'utiliser des valeurs fausses au lieu du retour d'une méthode statique? Les tests s'exécutent dans des AppDomains différents dans xUnit.net – Gishu

+0

La mise en place des instructions Console.WriteLine indique les constructeurs s'exécutant lorsque le test est exécuté dans le cadre de la classe entière. Mais le débogage individuellement (avec un point d'arrêt sur les instructions Writeline) la première chose que je rencontre dans le débogueur est le NullReference étant lancé, pas les points d'arrêt. – BenA

+0

Cela peut être dû au fait que votre méthode statique MyTestData est invoquée avant que le test ne soit exécuté pour une raison quelconque - puisque vous n'avez pas à construire l'objet pour appeler une méthode statique. Cette conception de test-fixture me rend un peu mal à l'aise - la méthode statique dépend d'un ctor de classe de base pour fonctionner correctement. La méthode PropertyData peut-elle être une méthode d'instance - essayez de déplacer temporairement le code d'installation de la classe de base ctor dans la méthode statique pour confirmer si c'est la cause. – Gishu

Répondre

1

Nous avons essayé de reproduire ceci avec xUnit.net 1.5 Beta et ne pouvons pas.

+0

Après plus de discussion sur CodePlex (http://xunit.codeplex.com/Thread/View.aspx?ThreadId=65564), j'ai juste besoin de refactoriser le test à la lumière de l'ordre d'exécution. – BenA

Questions connexes