在ASP.NET Core中模拟IPrincipal

我有一个正在为其编写单元测试的ASP.NET MVC Core应用程序。一种操作方法使用用户名来实现某些功能:

SettingsViewModel svm = _context.MySettings(User.Identity.Name);

显然在单元测试中失败了。我环顾四周,所有建议均来自.NET

4.5以模拟HttpContext。我相信有更好的方法可以做到这一点。我试图注入IPrincipal,但是抛出了错误。我什至尝试了一下(我想是出于绝望):

public IActionResult Index(IPrincipal principal = null) {

IPrincipal user = principal ?? User;

SettingsViewModel svm = _context.MySettings(user.Identity.Name);

return View(svm);

}

但这也引发了错误。在文档中也找不到任何内容…

回答:

可以通过的来访问控制器的。后者存储在中。User

HttpContextControllerContext

设置用户的最简单方法是为构造的用户分配不同的HttpContext。我们可以DefaultHttpContext为此目的使用,这样就不必模拟所有内容。然后,我们仅在控制器上下文中使用该HttpContext并将其传递给控制器​​实例:

var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]

{

new Claim(ClaimTypes.Name, "example name"),

new Claim(ClaimTypes.NameIdentifier, "1"),

new Claim("custom-claim", "example claim value"),

}, "mock"));

var controller = new SomeController(dependencies…);

controller.ControllerContext = new ControllerContext()

{

HttpContext = new DefaultHttpContext() { User = user }

};

创建自己的时ClaimsIdentity,请确保将显式传递authenticationType给构造函数。这确保了它IsAuthenticated可以正常工作(以防您在代码中使用它来确定用户是否已通过身份验证)。

以上是 在ASP.NET Core中模拟IPrincipal 的全部内容, 来源链接: utcz.com/qa/402894.html

回到顶部