asp.net - 在 Asp.Net MVC 中模拟 My.User.IsInRole() 和 ClaimsPrincipal
问题描述
我有一个单元测试来模拟以下控制器中的 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 = "user@hotmail.com" 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, "user@hotmail.com"))
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
所以一个是mock principal,一个不是mock principal,我怎么分配当前线程呢?
解决方案
第二个模拟覆盖了在线程上设置的第一个模拟。
使用模拟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
推荐阅读
- json - Json解析字典中的数组
- postman - Restsharp vs Postman - 视频的内容类型
- python - 在熊猫,python中分组和转置
- python - 如何从 deepcopy 中排除特定引用?
- makefile - 在 OpenWRT 中使用 Makefile.am
- apache-kafka - 带有模式演变的 Kafka avro 序列化
- python - 在 Robot Framework 中设置“syslog”不显示有关静默忽略的测试用例的任何详细信息
- java - 添加 FilteredList 和 SortedList 以在 Javafx 中创建搜索栏会返回 java.lang.reflect.InvocationTargetException
- autodesk-forge - Forge .net api 中的更新
- spreadsheet - 带有条件和分组的 Libreoffice 计数