Как я могу гарантировать удаление объекта в моем синглтоне до закрытия приложения?

Я использую WatiN для некоторых автоматических тестов и обнаружил, что создание экземпляра IE для каждого теста не масштабируемо. Время создания и выключения каждого экземпляра IE съедало меня заживо:

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

Однако оператор using оказался полезным в том смысле, что я всегда могу гарантировать, что у моего экземпляра IE будет вызван метод dispose (), который закроет окно 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;
        }
    }
}

И тест сейчас:

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

Это работает хорошо, и мои тесты теперь выполняются намного быстрее, когда я ' m не открывать и не закрывать IE каждый тест. Однако у меня есть одна проблема: когда тесты завершатся, мой экземпляр IE останется открытым.

Я не могу придумать элегантный способ гарантировать, что BrowserPool.Browser вызвал dispose () или close () до завершения приложения. Я даже попытался использовать финализатор в классе BrowserPool, но это, похоже, не сработало, потому что переменная _browser уже была восстановлена ​​при вызове моего финализатора.

Как убедиться, что dispose () вызывается в моем экземпляре IE после выполнения теста?

5
задан KingNestor 7 January 2012 в 18:44
поделиться