2010-12-02 6 views
1

J'ai rencontré un problème avec NUnit et CallContext (en utilisant C#) où NUnit copie tout ce qui dans le contexte d'appel existant qui étend ILogicalThreadAffinative quand un nouveau thread est créé. Par exemple, dans l'exemple suivant une exception est toujours jeté dans le thread nouvellement créé:Copie NUnit ILogicalThreadAffinative éléments dans CallContext à de nouveaux threads

[Test] 
    public void TestCopiedCallContext() 
    { 
     Foo f = new Foo(); 
     f.a = 1; 
     CallContext.SetData("Test", f); 
     new Thread(new ThreadStart(delegate() 
     { 
      if (CallContext.GetData("Test") != null) 
      { 
       throw new Exception("Bad!"); 
      } 
     })).Start(); 
     Thread.Sleep(500); 
    } 

    class Foo : ILogicalThreadAffinative 
    { 
     public int a; 
    } 

Si Foo ne dépasse pas ILogicalThreadAffinative le test passe. J'utilise .NET 2.0 (en raison d'autres restrictions, nous ne pouvons pas utiliser les nouvelles versions de .NET). J'ai également essayé d'utiliser les attributs Requires * disponibles dans la dernière version de NUnit mais sans succès. Est-ce que quelqu'un sait comment désactiver ce comportement?

Répondre

0

Je ne crois pas que vous pouvez faire ce que vous essayez de faire. Une personne a suggéré de placer le code dans un ensemble où le coureur d'essai a accès.

Il ya un blog post que vous connaissez probablement, qui décrit le problème.

Le code de test unitaire multithreading peut être difficile et j'ai tendance à isoler les threads et à envelopper les objets statiques.

Si c'était moi, je pense que j'essaierais d'isoler CallContext.SetData et CallContext.GetData en enveloppant le contexte d'appel dans une classe CallContextWrapper: ICallContextWrapper.

Je voudrais tester que mon code utilise contextWrapper.SetData ("Test", f) et être fait avec; Je voudrais croire que quiconque a écrit CallContext a testé sa capacité à prendre certaines données et à les transférer vers un nouveau thread. IMO CallContext est un code d'infrastructure qui devrait déjà avoir été testé, il vous suffit donc d'isoler la dépendance de votre code sur CallContext.

Questions connexes