В настоящее время я выполняю рефакторинг некоторого кода, который выполняет Windows Impersonation для тестируемости и натолкнулся на препятствие. Вот фрагмент кода, с которым у меня возникают проблемы:
...
if (LogonUserA(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) > 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate))
{
var tempWindowsIdentity = new System.Security.Principal.WindowsIdentity(tokenDuplicate);
var impersonationContext = tempWindowsIdentity.Impersonate();
...
}
...
}
Как мне смоделировать поведение создания экземпляра объекта WindowsIdentity? Я думал о различных альтернативах:
- Передайте фабричный класс, который создаст экземпляр и высмеет поведение этого
- Передать делегат, который обрабатывает создание экземпляра (то есть, как указатель на функцию C ++)
Ни одна из этих альтернатив не кажется мне особенно полезной, потому что, боюсь, они затуманят цель метода, поскольку сигнатура метода будет выглядеть примерно так:
public bool Impersonate(string user, string password, string domain, Factory factory)
или
public bool Impersonate(string user, string password, string domain, delegate WinIDCreator)
Поскольку целью метода является олицетворение конкретного пользователя, для меня не имеет смысла предоставлять класс Factory или Delegate. Однако я хочу изолировать и смоделировать это поведение, так как меня не устраивает мысль о том, что новый экземпляр WindowsIdentity создается каждый раз, когда я запускаю несколько модульных тестов.
Есть идеи или комментарии?