Я использую 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 после выполнения теста?