У меня есть модульный тест для имитации My.User.IsInRole () и ClaimsPrincipal в следующем контроллере.
Текущий принцип потока был назначен дважды, поэтому работает только второй ClaimPrincipal, как я могу сделать, чтобы оба принципа макета работали?
Public Class TestController
Public Function GetUserDetail() As String
If My.User.IsInRole("Agent") Then
result = "Login as Agent"
End If
If ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value = "[email protected]" Then
result = result & " and Claim name is correct"
End If
Return result
End Function
End Class
пытаюсь настроить макет в этом тестовом примере (код VB, C# тоже в порядке):
<TestMethod()>
Public Sub Test()
//Arrange
//Mock User.IsInRole():
Dim fakePrincipal = New Moq.Mock(Of IPrincipal)()
fakePrincipal.Setup(Function(p) p.IsInRole("Agent")).Returns(True)
Thread.CurrentPrincipal = fakePrincipal.[Object]
'Dim fakeClaimPrincipal = New Mock(Of ClaimsPrincipal)()
'Dim claims As IEnumerable(Of Claim) = New List(Of Claim) ().AsEnumerable()
'fakeClaimPrincipal.Setup(Sub(e) e.Claims).Returns(claims)
'Thread.CurrentPrincipal = fakeClaimPrincipal.[Object]
//Mocking is not working on ClaimsPrincipal.FindFirst(), so it's fixed
by using claim based function:
Thread.CurrentPrincipal = New TestPrincipal(New Claim(ClaimTypes.Name, "[email protected]"))
Public Class TestPrincipal
Inherits ClaimsPrincipal
Public Sub New(ParamArray claims As Claim())
MyBase.New(New TestIdentity(claims))
End Sub
End Class
Public Class TestIdentity
Inherits ClaimsIdentity
Public Sub New(ParamArray claims As Claim())
MyBase.New(claims)
End Sub
End Class
// Act
Dim result = TestController.GetUserDetail()
End Sub
Итак, один является фиктивным принципалом, другой не является фиктивным принципалом, как мне назначить текущий поток?
Второй макет отменяет первый, который был установлен в потоке.
Используйте макет ClaimsPrincipal
и настройте необходимых участников
<TestMethod()>
Public Sub Test()
//Arrange
Dim fackClaimPrinciple = New Mock(Of ClaimsPrincipal)()
Dim claims As IEnumerable(Of Claim) = New List(Of Claim) ().AsEnumerable()
fackClaimPrinciple.Setup(Sub(e) e.Claims).Returns(claims)
fackClaimPrinciple.Setup(Function(p) p.IsInRole("Agent")).Returns(True)
Thread.CurrentPrincipal = fackClaimPrinciple.[Object]
// Act
Dim result = TestController.GetUserDetail()
End Sub
В этом случае хорошо использовать один принципал. См. Изменение кода, которое я сделал выше, один является фиктивным принципалом, другой не является фиктивным принципалом, возможно ли использовать одного принципала, назначенного текущему потоку?
Возможный дубликат Mock My.User.IsInRole () ошибка в Asp.Net MVC