8

我有可以从多种客户端类型(例如 WinForms、Console、ASP.NET 等)调用的库代码,并且需要确定当前的主体。为此,我对 Thread.CurrentPrincipal 和 Environment.UserName 执行两步检查,如下所示:

var currentUser = !System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated ? null : System.Threading.Thread.CurrentPrincipal.Identity.Name;
if (string.IsNullOrWhiteSpace(currentUser))
{
    currentUser = Environment.UserName;
}

在控制台应用程序 Thread.CurrentPrincipal.Identity.IsAuthenticated 中始终为 false 但是在 MSTest 中它始终具有有效的经过身份验证的用户。

无论如何将单元测试中 Thread.CurrentPrincipal 的值重置为未经身份验证以模仿控制台应用程序?

4

2 回答 2

13

您需要做的就是:

Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(""), new string[0]);
于 2012-10-09T09:08:44.417 回答
0

我宁愿创建一个类,该类CurrentPrincipal通过其适当的接口实现所有管理,并将该接口注入您需要的地方。

然后你可以在单元测试中模拟它,使它们更简单。

于 2014-01-15T07:37:20.897 回答