我目前正在重构一些执行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)
因为该方法的目的是为了冒充特定的用户,它没有任何意义,我认为无论是工厂类或代表应提供给它。我想要隔离和嘲笑这种行为,但是我对每次运行一堆单元测试时创建的新WindowsIdentity实例的想法感到不自在。
任何想法或意见?
谢谢你。我应该补充说我已经将登录内容封装到一个NativeMethods类中,并简单地将它们嘲笑出来。担心我将这个工厂注入到类中与使用它作为一个方法参数是一样的 - 让一个类对类工厂有依赖是不自然的...... – jpoh 2009-07-22 03:08:24