【问题标题】:How to Mock ClaimsPrincipal in unit test .net如何在单元测试.net 中模拟 ClaimsPrincipal
【发布时间】:2018-10-06 16:14:50
【问题描述】:

我正在对我的控制器方法进行单元测试,以获取来自 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

【问题讨论】:

    标签: .net asp.net-mvc vb.net unit-testing


    【解决方案1】:

    您可以将声明原则分配给当前线程原则,

            // 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 对象为空。
    • ClaimsPrincipal.Current.Claims(0).value 返回正确的值,但 ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value 出现异常错误。
    【解决方案2】:

    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"))
    

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2017-04-14
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多