在Asp.Net MVC中模拟My.User.IsInRole()和ClaimsPrincipal

时间:2018-05-02 14:14:38

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

我有一个单元测试来模拟以下控制器中的My.User.IsInRole()和ClaimsPrincipal。

当前线程原则已经分配了两次,因此只有第二个ClaimPrincipal正在工作,我该如何才能使两个模拟原理工作?

Node* Node::get_child(int i) /*const*/ { // cant be const for the return
    if (i >= nodes.size()) {
        return NULL;
    }
    return &nodes[i];
}

尝试在此测试用例中设置模拟(VB代码,C#也可以):

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

所以一个是模拟主体,另一个不是模拟主体,我如何分配当前线程?

1 个答案:

答案 0 :(得分:1)

第二个模拟重写了在线程上设置的第一个模拟。

使用模拟的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