2012-01-07 30 views
5

Tôi đang sử dụng WatiN cho một số thử nghiệm tự động và những gì tôi thấy là việc tạo một cá thể IE cho mọi thử nghiệm không thể mở rộng được. Việc tạo ra và tắt máy thời gian của mỗi trường hợp IE đang ăn tôi còn sống:Làm thế nào tôi có thể đảm bảo rằng tôi vứt bỏ một đối tượng trong đơn của tôi trước khi đơn đăng ký đóng?

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

Tuy nhiên, báo cáo kết quả sử dụng đã chứng minh hữu ích trong đó tôi luôn có thể đảm bảo rằng dụ IE của tôi sẽ có phương pháp xử lý() của nó gọi mà sẽ đóng cửa sổ IE.

Dù sao, tôi đã tạo ra một singleton mà duy trì một trường hợp duy nhất trình duyệt IE mà tất cả các bài kiểm tra của tôi sử dụng trên tất cả các lớp học thử nghiệm của tôi:

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

Và kiểm tra bây giờ:

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

này hoạt động tốt và kiểm tra của tôi chạy nhanh hơn nhiều bây giờ mà tôi không mở và đóng IE mọi thử nghiệm. Tuy nhiên, tôi có một vấn đề trong đó khi các bài kiểm tra hoàn thành thể hiện IE của tôi vẫn sẽ vẫn mở.

Tôi không thể tìm ra cách thanh lịch để đảm bảo rằng BrowserPool.Browser đã bỏ() hoặc close() được gọi trước khi ứng dụng kết thúc. Tôi thậm chí đã thử sử dụng một finalizer trong lớp BrowserPool nhưng điều đó dường như không hoạt động vì biến _browser đã được khai hoang khi finalizer của tôi được gọi.

Làm cách nào để đảm bảo rằng việc vứt bỏ() được gọi trên cá thể IE của tôi sau khi chạy thử?

+0

Bạn đã thử đặt việc vứt bỏ trong phá hủy Singleton? –

+0

@ M.Babcock, tôi có và nó không hoạt động. Biến trình duyệt đã được khai hoang trước khi hàm hủy được gọi. – KingNestor

Trả lời

4

Sử dụng [AssemblyCleanupAttribute()] để làm sạch tài nguyên sau khi kiểm tra của bạn được tìm thấy trong quá trình lắp ráp hoàn tất.

Btw, không bao giờ dựa vào việc sử dụng trình phá hủy trong .NET.

+0

Giả sử bạn đang chạy VS> Chuyên nghiệp. – mxmissile

Các vấn đề liên quan