mock GetClaimsPrincipal()。Identity

时间:2016-04-20 06:19:00

标签: c# unit-testing mocking claims-based-identity

我无法找到以下代码行的模拟。

ClaimsPrincipalFactory userClaimsPrincipal = new UserClaimsPrincipalFactory();
System.Security.Claims.ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as System.Security.Claims.ClaimsIdentity;

当我尝试模拟时,我收到错误

  

Microsoft.Owin.Host.SystemWeb.dll中发生了'System.NullReferenceException'类型的异常,但未在用户代码中处理

在下面的代码中。

public class UserClaimsPrincipalFactory : ClaimsPrincipalFactory
{
    protected override ClaimsPrincipal OnGetClaimsPrincipal()
    {
        return HttpContext.Current.GetOwinContext().Authentication.User;
    }
}

模拟我试过

Mock<UserClaimsPrincipalFactory> mockUserClaimsPrincipal = new Mock<UserClaimsPrincipalFactory>();
mockUserClaimsPrincipal
    .Setup(ucp => ucp.GetClaimsPrincipal().Identity).Returns("Need to set");

任何人都可以帮助我。提前谢谢。

2 个答案:

答案 0 :(得分:1)

以下代码......

ClaimsPrincipalFactory userClaimsPrincipal = new UserClaimsPrincipalFactory();
ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as ClaimsIdentity;

正在用作需要claimIdentity变量的大型测试的一部分,然后您需要抽象UserClaimsPrincipalFactory,因为此类的具体实现与{{1}紧密耦合除非你还嘲笑HttpContext(你不应该这样做:Don't mock HttpContext: He doesn't like to be mocked!

如果最终目标是获得HttpContext,那么您可以将该需求抽象为服务。

ClaimsPrincipal/ClaimsIdentity

通过这种方式,您可以在不直接依赖public interface IClaimsPrincipalFactory { ClaimsPrincipal GetClaimsPrincipal(); } 的情况下进行测试。

这里的假设是你可以直接控制HttpContext类并且可以重构它....

ClaimsPrincipalFactory

完成后,单元测试看起来就像....

public abstract class ClaimsPrincipalFactory : IClaimsPrincipalFactory {
    public ClaimsPrincipal GetClaimsPrincipal() {
        ClaimsPrincipal result = OnGetClaimsPrincipal();
        //...other code
        return result;
    }
    protected abstract ClaimsPrincipal OnGetClaimsPrincipal();
}

答案 1 :(得分:1)

您可以使用Typemock Isolator执行此操作。 Isolate.WhenCalled()模仿OnGetClaimsPrincipal(),因此它根本不会触及HttpContext,并返回所需的ClaimsPrincipal。参见示例:

public void TestGetClaimsPrincipal()
{
    //Arrange 
    var claims = new List<Claim>();
    claims.Add(new Claim(ClaimTypes.Name, "Name"));
    claims.Add(new Claim(ClaimTypes.Email, "name@gmail.com"));
    var myIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
    var myPrincipal = new ClaimsPrincipal(myIdentity);
    var target = new UserClaimsPrincipalFactory();
    Isolate.NonPublic.WhenCalled(target, "GetClaimsPrincipal").WillReturn(myPrincipal);

    //Act
    var result = Isolate.Invoke.Method(target, "GetClaimsPrincipal") as ClaimsPrincipal;

    //Assert
    Assert.AreEqual("Name", result.Identity.Name);
}

希望它有所帮助!

相关问题