2009-10-20 13 views
0

Je rencontre un problème avec la version 1 de Ninject et la réinitialisation de StandardKernel. J'ai un objet statique que j'utilise pour fournir un accès au noyau comme siRéinitialisation d'un IKernel dans Ninject v1

public static class ObjectFactory 
{ 
    private static IKernel _kernel = new StandardKernel(new CanceisModule()); 

    // Resolve methods snipped for brevity 

    public static void Reset() 
    { 
     _kernel = null; 
     _kernel = new StandardKernel(new CanceisModule()); 
    } 
} 

Le problème vient quand je tente d'utiliser ObjectFactory dans divers tests unitaires (j'utiliser MSTest) ou accessoires FitNesse. J'appelle toujours la méthode ObjectFactory.Reset() avant chaque nouveau test ou montage, mais il semble parfois que la réinitialisation ne fonctionne pas réellement et laisse les liaisons d'origine en place. Je sais qu'il existe un moyen de réinitialiser les objets IKernel dans v2 de Ninject mais nous ne sommes pas encore prêts à le faire (et c'est un mouvement assez important pour nous).

Quelqu'un pourrait-il donner des conseils sur les raisons pour lesquelles cela pourrait se produire? Je suppose qu'il est lié à la façon dont les tests sont exécutés sur des threads distincts dans les différents coureurs, mais comment puis-je l'éviter?

Merci d'avance

Répondre

0

Votre approche semble bien.

En général, les coureurs de test n'exécutent pas de multi-thread ou de magie comme vous le pensez.

Je suggérerais de mettre un point d'arrêt dans votre Reset() et de déboguer vos tests.

Votre code a une méthode non statique dans une classe statique, y a-t-il autre chose que vous omettez de mentionner?

Quand vous dites "nouveau test ou appareil", c'est quoi? Souvent, vous utilisez Ninject dans les tests, il vaut mieux garder un noyau dans une classe de base et vous assurer qu'il est réinitialisé au bon moment pour éviter toute confusion ou doute [plutôt que de s'appuyer sur un objet 'singleton'].

+0

La réinitialisation non statique était une faute de frappe (pas d'Internet à mon bureau, donc je dois copier du mieux que je peux). Lorsque je débogue les tests (MSTest ou Fitnesse le comportement se produit dans les deux) la méthode Reset fonctionne toujours. C'est ce qui est si perplexe. Quand je dis «nouveau test ou appareil», je veux dire que cela arrive dans les deux cas. Dans les projecteurs, j'appelle toujours ObjectFactory.Reset dans le constructeur de l'appareil lui-même. Dans MSTest, j'ai une classe de base que toutes les autres classes dérivent de cet appel ObjectFactory.Reset() avant chaque test en utilisant la méthode [TestInitialize]. D'autres suppositions? –

+0

Est-ce que le simple fait de libérer la référence [comme vous le faites dans Reset()] à l'ancien noyau ne déclenche pas l'élimination (et la finalisation) des objets au bon endroit? Si vous comptez sur le nettoyage pour supprimer des liens vers des objets partagés, etc., cela peut être retardé jusqu'à l'heure du CPG. Je ne suis pas un expert MSTest, mais TestInitialize semble être l'endroit par défaut le plus sûr pour le mettre (pour des raisons d'isolation). Bottom line: Ni select, ni le cadre de test est cassé - il y a de fortes chances qu'il y ait quelque chose dans vos objets car ils vivent dans le module, ce qui signifie qu'ils ne se nettoient pas correctement. –

+0

Haviong a déclaré que, pour moi, toute cette confusion de ce qui se passe et ne se passe pas au démarrage dans NUnit et MSTest disparaît dans xUnit.net. Je suis désolé d'avoir gaspillé tant de ma vie à tracer des hiérarchies alambiquées d'initialisation de test. –