2012-01-07 3 views
5

몇 가지 자동화 된 테스트에 WatiN을 사용하고 있는데, 모든 테스트에 대해 IE 인스턴스를 만드는 것이 확장 가능하지 않다는 것을 발견했습니다. 각 IE 인스턴스의 생성과 종료 시간은 나를 살아 먹고 있었다 :응용 프로그램을 종료하기 전에 개체를 처형 할 수 있도록하려면 어떻게합니까?

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

그러나, using 문을 사용한다는 점에서 유용 않았다 난 항상 내 IE 인스턴스가 처분() 메소드가 종료 것이다라는 것이다 보장 할 수 있습니다 IE 윈도우.

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; 
     } 
    } 
} 

그리고 지금 테스트 : :

어쨌든, 내 모든 시험 내 모든 테스트 클래스를 통해 사용하는 하나의 IE 인스턴스 유지 싱글 생성이 잘 작동

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

및 내 테스트는 훨씬 빨리 실행되므로 IE를 열거 나 닫지 않을 것입니다. 그러나 테스트가 완료되면 IE 인스턴스가 여전히 열려있을 것이므로이 문제점이 있습니다.

응용 프로그램이 끝나기 전에 BrowserPool.Browser가 dispose() 또는 close()를 호출하도록하는 우아한 방법을 이해할 수 없습니다. BrowserPool 클래스에서 finalizer를 사용하여 시도해 보았지만 파이널 라이저가 호출되었을 때 _browser 변수가 이미 교정되었으므로 작동하지 않는 것 같습니다.

테스트를 실행 한 후 IE 인스턴스에서 dispose()가 호출되도록하려면 어떻게해야합니까?

+0

싱글 톤의 소멸자에 처분을 시도 했습니까? –

+0

@ M.Babcock, 나는 가지고 있고 작동하지 않았다. 브라우저 변수는 소멸자가 호출 될 때까지 이미 회수되었습니다. – KingNestor

답변

4

조립품에있는 검사가 완료된 후에 [AssemblyCleanupAttribute()]을 사용하여 자원을 청소하십시오.

Btw는 .NET에서 소멸자를 사용하지 마십시오.

+0

실행중인 VS> Professional이라고 가정합니다. – mxmissile

관련 문제