首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟GetClaimsPrincipal().Identity

模拟GetClaimsPrincipal().Identity
EN

Stack Overflow用户
提问于 2016-04-20 06:19:00
回答 2查看 407关注 0票数 1

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

代码语言:javascript
复制
ClaimsPrincipalFactory userClaimsPrincipal = new UserClaimsPrincipalFactory();
System.Security.Claims.ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as System.Security.Claims.ClaimsIdentity;

当我试图嘲弄时,我就会犯错。

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

在下面的代码。

代码语言:javascript
复制
public class UserClaimsPrincipalFactory : ClaimsPrincipalFactory
{
    protected override ClaimsPrincipal OnGetClaimsPrincipal()
    {
        return HttpContext.Current.GetOwinContext().Authentication.User;
    }
}

冒充我试过

代码语言:javascript
复制
Mock<UserClaimsPrincipalFactory> mockUserClaimsPrincipal = new Mock<UserClaimsPrincipalFactory>();
mockUserClaimsPrincipal
    .Setup(ucp => ucp.GetClaimsPrincipal().Identity).Returns("Need to set");

有人帮我做这件事。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-04-20 12:03:04

如果下面的代码..。

代码语言:javascript
复制
ClaimsPrincipalFactory userClaimsPrincipal = new UserClaimsPrincipalFactory();
ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as ClaimsIdentity;

作为更大的测试的一部分,您需要claimIdentity变量,然后需要抽象UserClaimsPrincipalFactory,因为这个类的具体实现与HttpContext紧密耦合在一起,除非您还模拟了HttpContext (您不应该这么做:不要嘲笑HttpContext:他不喜欢被嘲笑!),否则它在测试期间是空的。

如果最终目标是获得一个ClaimsPrincipal/ClaimsIdentity,那么您就可以将该需求抽象到服务中。

代码语言:javascript
复制
public interface IClaimsPrincipalFactory {
    ClaimsPrincipal GetClaimsPrincipal();
}

这样,您就可以在不依赖HttpContext的情况下进行测试。

这里的假设是,您可以直接控制ClaimsPrincipalFactory类并可以重构它.

代码语言:javascript
复制
public abstract class ClaimsPrincipalFactory : IClaimsPrincipalFactory {
    public ClaimsPrincipal GetClaimsPrincipal() {
        ClaimsPrincipal result = OnGetClaimsPrincipal();
        //...other code
        return result;
    }
    protected abstract ClaimsPrincipal OnGetClaimsPrincipal();
}

这样做了,单元测试看起来就像.

代码语言:javascript
复制
[TestMethod]
public void Factory_Should_Get_Claims_Principal() {
    //Arrange
    var fakeIdentity = new ClaimsIdentity();
    var mockUserClaimsPrincipal = new Mock<IClaimsPrincipalFactory>();
    mockUserClaimsPrincipal.Setup(ucp => ucp.GetClaimsPrincipal().Identity).Returns(fakeIdentity);

    IClaimsPrincipalFactory userClaimsPrincipal = mockUserClaimsPrincipal.Object;
    System.Security.Claims.ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as System.Security.Claims.ClaimsIdentity;

    //Act
    //...other code that uses the claimIdentity


    //Assert
    //...other assertions
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-25 11:28:16

你可以用悬挂式隔离器来做。Isolate.WhenCalled()模拟OnGetClaimsPrincipal(),因此它根本不碰HttpContext,并返回所需的ClaimsPrincipal。参见示例:

代码语言:javascript
复制
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);
}

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36735329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档