如何在 .NET 单元测试中模拟 ClaimsPrincipal?

3

我正在对我的控制器方法进行单元测试,以从ClaimsPrincipal对象中获取信息,但Current.FindFirst()没有返回任何结果,有人能帮助一下吗?谢谢。(可使用VB和C#编写):

  Public Class TestController
    Public Function GetEmail() As String
         Return ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value
    End Function
  End Class

<TestMethod()>
Public Sub Test()
  //Arrange
    Dim fackClaimPrinciple = New Mock(Of ClaimsPrincipal)()
    Dim claims = New List(Of Claim)() From {New Claim(ClaimTypes.Name, "user@hotmail.com")}
    fackClaimPrinciple.Setup(Function(e) e.Claims).Returns(claims)
    Thread.CurrentPrincipal = fackClaimPrinciple.[Object]

  // Act
  Dim result = TestController.GetEmail()

  '... ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value Returns nothing??

End Sub
2个回答

5
你可以将声明原则分配给当前线程原则。
        // Make fack claims principle instance
        var fackClaimPrinciple = new Mock<ClaimsPrincipal>();

        // Setup fack data
        IEnumerable<Claim> claims = new List<Claim>() {
            new Claim(ClaimTypes.Name, "user@hotmail.com")
        }.AsEnumerable();
        fackClaimPrinciple.Setup(e => e.Claims).Returns(claims);

        // Assign to current thread principle
        Thread.CurrentPrincipal = fackClaimPrinciple.Object;            

        // Act
        ViewResult result = homeController.Index() as ViewResult;

        // Assert
        Assert.IsNotNull(result);

@programthreasures 谢谢。我按照你的代码进行了操作,但在调用控制器 GetEmail() 方法时,ClaimsPrincipal 对象为空。 - Julia
ClaimsPrincipal.Current.Claims(0).Value 返回了正确的值,但是 ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value 报出了异常错误。 - Julia

0

Mocking 在 ClaimsPrincipal.FindFirst() 上不起作用,因此通过使用基于声明的函数进行修复:

Public Class TestIdentity
    Inherits ClaimsIdentity
    Public Sub New(ParamArray claims As Claim())
        MyBase.New(claims)
    End Sub
End Class

Public Class TestPrincipal
    Inherits ClaimsPrincipal
    Public Sub New(ParamArray claims As Claim())
        MyBase.New(New TestIdentity(claims))
    End Sub
End Class

Thread.CurrentPrincipal = New TestPrincipal(New Claim(ClaimTypes.Name, "user@hotmail.com"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接