2012-01-07 21 views
5

मैं कुछ स्वचालित परीक्षणों के लिए WatiN का उपयोग कर रहा हूं और मुझे जो मिला वह था कि प्रत्येक परीक्षण के लिए आईई इंस्टेंस बनाना स्केलेबल नहीं था। प्रत्येक आईई उदाहरण के निर्माण और शट डाउन समय मुझे जिंदा खा रहा था:मैं यह सुनिश्चित कैसे कर सकता हूं कि एप्लिकेशन बंद होने से पहले मैं अपने सिंगलटन में किसी ऑब्जेक्ट का निपटान करूँ?

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

हालांकि, कथन का उपयोग कि में उपयोगी साबित किया मैं हमेशा सुनिश्चित कर सकते हैं कि मेरे आईई उदाहरण, अपना निपटाने() विधि कहा जाता है जो बंद कर दिया होता आईई खिड़की।

public class BrowserPool 
{  
    private static readonly Lazy<BrowserPool> _instance = new Lazy<BrowserPool>(() => new BrowserPool());   

    private IE _browser; 
    private string _ieHwnd; 
    private int _threadId; 

    public IE Browser 
    { 
     get 
     { 
      var currentThreadId = GetCurrentThreadId(); 
      if (currentThreadId != _threadId) 
      { 
       _browser = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd)); 
       _threadId = currentThreadId; 
      } 
      return _browser; 
     } 
     set 
     { 
      _browser = value; 
      _ieHwnd = _browser.hWnd.ToString(); 
      _threadId = GetCurrentThreadId(); 
     } 
    } 

    /// <summary> 
    /// private to prevent direct instantiation. 
    /// </summary> 
    private BrowserPool() 
    { 
     Browser = new IE(); 
    } 

    /// <summary> 
    /// Get the current executing thread's id. 
    /// </summary> 
    /// <returns>Thread Id.</returns> 
    private int GetCurrentThreadId() 
    { 
     return Thread.CurrentThread.GetHashCode(); 
    } 

    /// <summary> 
    /// Accessor for instance 
    /// </summary> 
    public static BrowserPool Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 
} 

और अब परीक्षण:

वैसे भी, मैं एक सिंगलटन जो एक एकल आईई उदाहरण है, जिसमें मेरे सभी परीक्षणों मेरे सारे परीक्षण वर्गों में उपयोग करने के लिए बनाए रखा बनाया

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

यह अच्छी तरह से काम करता है और मेरे परीक्षण अब बहुत तेजी से चलते हैं कि मैं प्रत्येक टेस्ट को खोलने और बंद करने के लिए नहीं खोल रहा हूं। हालांकि, मेरे पास यह एक समस्या है जब मेरे आईई इंस्टेंस को पूरा करने के परीक्षण अभी भी खुले रहेंगे।

मैं यह सुनिश्चित करने के लिए एक शानदार तरीका नहीं समझ सकता कि ब्राउज़रपूल.ब्राउज़र ने आवेदन समाप्त होने से पहले इसे() या बंद() पर बुलाया है। मैंने ब्राउज़रपूल क्लास में फाइनलाइज़र का उपयोग करने का भी प्रयास किया लेकिन यह काम नहीं कर रहा था क्योंकि _browser वैरिएबल को पहले से ही पुनः प्राप्त कर लिया गया था जब मेरा फ़ाइनलाइज़र कहा जाता है।

मैं कैसे सुनिश्चित कर सकता हूं कि परीक्षण (आई) परीक्षण के बाद मेरे आईई उदाहरण पर कॉल किया जाता है?

+0

क्या आपने सिंगलटन के विनाशक में निपटान करने की कोशिश की है? –

+0

@ एम। बाबाकॉक, मेरे पास है और यह काम नहीं करता है। ब्राउज़र परिवर्तक पहले से ही विनाशक कहलाता था जब तक दावा किया गया था। – KingNestor

उत्तर

4

विधानसभा में आपके परीक्षणों के बाद संसाधनों को साफ करने के लिए [AssemblyCleanupAttribute()] का उपयोग करें।

बीटीडब्ल्यू, .NET में विनाशकों के उपयोग पर कभी भरोसा न करें।

+0

अपने चल रहे वीएस> पेशेवर मानते हैं। – mxmissile