Comment puis-je m’assurer que je dispose d’un object dans mon singleton avant la fermeture de l’application?

J’utilise WatiN pour certains tests automatisés et j’ai découvert que la création d’une instance IE pour chaque test n’était pas évolutive. L’heure de création et d’arrêt de chaque instance IE me dévorait:

[TestMethod] public void Verify_Some_Useful_Thing() { using (var browser = new IE()) { browser.GoTo("/someurl"); // etc.. // some assert() statements } } 

Cependant, l’instruction using s’est avérée utile dans la mesure où je peux toujours m’assurer que ma méthode dispose () de mon instance IE sera appelée, ce qui fermerait la fenêtre IE.

Quoi qu’il en soit, j’ai créé un singleton qui maintenait une seule instance IE que tous mes tests utilisent dans toutes mes classes de test:

 public class BrowserPool { private static readonly Lazy _instance = new Lazy(() => new BrowserPool()); private IE _browser; private ssortingng _ieHwnd; private int _threadId; public IE Browser { get { var currentThreadId = GetCurrentThreadId(); if (currentThreadId != _threadId) { _browser = IE.AttachTo(Find.By("hwnd", _ieHwnd)); _threadId = currentThreadId; } return _browser; } set { _browser = value; _ieHwnd = _browser.hWnd.ToSsortingng(); _threadId = GetCurrentThreadId(); } } ///  /// private to prevent direct instantiation. ///  private BrowserPool() { Browser = new IE(); } ///  /// Get the current executing thread's id. ///  /// Thread Id. private int GetCurrentThreadId() { return Thread.CurrentThread.GetHashCode(); } ///  /// Accessor for instance ///  public static BrowserPool Instance { get { return _instance; } } } 

Et le test maintenant:

  [TestMethod] public void Verify_Some_Useful_Thing() { var browser = BrowserPool.Instance.Browser; browser.GoTo("/someurl"); // some assertions } 

Cela fonctionne bien et mes tests courent beaucoup plus vite maintenant que je n’ouvre ni ne ferme IE à chaque test. Cependant, j’ai un problème avec le fait que lorsque les tests seront terminés, mon instance IE restra toujours ouverte.

Je n’arrive pas à trouver un moyen élégant de s’assurer que BrowserPool.Browser a appelé () ou close () appelé avant la fin de l’application. J’ai même essayé d’utiliser un finaliseur dans la classe BrowserPool mais cela ne semblait pas fonctionner car la variable _browser avait déjà été récupérée lors de l’appel de mon finaliseur.

Comment puis-je m’assurer que dispose () est appelé sur mon instance IE après l’exécution du test?

Utilisez [AssemblyCleanupAtsortingbute ()] pour nettoyer les ressources une fois que les tests trouvés dans l’assembly sont terminés.

Au fait, ne comptez jamais sur l’utilisation de destructeurs dans .NET.