【发布时间】:2023-03-09 05:41:01
【问题描述】:
我目前正在重构一些执行 Windows 模拟以实现可测试性的代码,但遇到了一些障碍。这是我遇到问题的代码:
...
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 实例,这让我感到不舒服。
有什么想法或方法吗?
【问题讨论】:
标签: c# unit-testing rhino-mocks