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

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

我正在对我的 Controller 方法对来自 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

最佳答案

您可以将声明原则分配给当前线程原则,

        // 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);

关于.net - 如何在单元测试 .net 中模拟 ClaimsPrincipal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50034918/

相关文章:

.net - XML 序列化中必需的属性

c# - TabControl.ControlRemoved 的预期行为是什么?

c# - 无法禁用 Controller 上的验证

android:以编程方式通过USB将sqlite数据库从PC传输到设备

vb.net - 将阿拉伯数字转换为十进制

.net - WCF 自定义绑定(bind) - 服务不支持的内容类型

.net - 你知道 MBUnit 的任何教程吗?

asp.net-mvc - 在 Mvc View 中获取查询错误结果无法枚举多次

asp.net - 可以创建 ASP.NET MVC 网站(相对于 Web 应用程序)

vb.net - Windows 窗体中的自动换行 (vb.net)