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

Jul*_*lia 2 .net vb.net asp.net-mvc unit-testing

我正在对我的控制器方法进行单元测试以获取来自 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
Run Code Online (Sandbox Code Playgroud)

pro*_*res 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);
Run Code Online (Sandbox Code Playgroud)