我是 ASP.NET Core 的新手。我需要在 C# 的单元测试中模拟
ClaimsPrincipal
,方法如下:
public class MyTestHelper
{
public static string getName(this ClaimsPrincipal principal)
{
string name = principal.Claims.Any(c => c.Type= "test") ?
Convert.ToString(principal.Claims.Where(i => i.Type = "test").FirstOrDefault().Value);
}
}
这是我到目前为止尝试过的。但是我收到一条错误消息,说无法从
IPrincipal
转换为ClaimsPrincipal
:
[Test]
public void getNameTest()
{
var principal = new Mock<IPrincipal>;
string name = MyTestHelper.getName(principal.Object);
}
感谢您的帮助!
抛出异常的原因是您的方法需要特定的
ClaimsPrincipal
实现,但您的模拟只是创建IPrincipal
的模拟。
老实说,虽然没有必要嘲笑
ClaimsPrincipal
。它是一个带有公共构造函数的轻量级公共类,这意味着您可以非常轻松地为您的测试创建一个(比模拟和设置要返回的声明更容易)。我们在单元测试中使用类似这样的东西,你可以在其中传递你想要的声明:
public static ClaimsPrincipal CreateClaimsPrincipal(params Claim[] identityClaims)
{
var identity = new ClaimsIdentity(identityClaims);
var principal = new ClaimsPrincipal(identity);
return principal;
}