Как смоделировать ClaimsPrincipal в модульном тесте .net - PullRequest
0 голосов
/ 26 апреля 2018

Я выполняю модульное тестирование моего метода контроллера для получения информации из объекта 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 ]

0 голосов
/ 27 апреля 2018

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"))
0 голосов
/ 26 апреля 2018

Вы можете присвоить принцип требований текущему принципу потока,

        // 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...