使用 .Net Core 2 和 Moq,如何设置 HTTP 上下文来伪造身份验证?

Using .Net Core 2 and Moq, how do you setup a HTTP Context to fake authentication?

我正在使用 Moq 在我的 .net core 2 应用程序中进行自动化测试。我们使用不记名身份验证,需要能够从 HttpContext 对象中提取名称以确保我们拥有正确的用户:

var userName = HttpContext.User.Identity.Name;

我找到了大量使用 System.Web 的示例,但 none 让我可以模拟 Core 2 设置。

好的,所以在拼凑了一些旧链接(即 )的帮助后,我能够让这个工作正常,我想我会 post 在这里 post :

public class ContextHelper
{
    public static HttpContext GetMockedHttpContext()
    {
        var context = new Mock<HttpContext>();
        var identity = new Mock<IIdentity>();
        var contextUser = new Mock<ClaimsPrincipal>();
        contextUser.Setup(ctx => ctx.Identity).Returns(identity.Object);
        identity.Setup(id => id.IsAuthenticated).Returns(true);
        identity.Setup(id => id.Name).Returns("validemail@test.com");
        context.Setup(x => x.User).Returns(contextUser.Object);

        return context.Object;
    }
}

这使我的单元测试可以轻松提取假用户的用户名。

我这样称呼它:

var uc = new UserController();
uc.ControllerContext.HttpContext = ContextHelper.GetMockedHttpContext();
uc.WhateverMethodGoesHere();

您可以实现相同的目的,而无需模拟任何东西并使用框架提供的现有 类。

public class ContextHelper {
    public static HttpContext GetHttpContext(string name = "validemail@test.com") {
        var identity = new GenericIdentity(name, "test");
        var contextUser = new ClaimsPrincipal(identity);
        var httpContext = new DefaultHttpContext() {
            User = contextUser
        };
        return httpContext;
    }
}

仅仅因为我们有能力模拟某些事情并不意味着我们必须在大多数时候进行模拟。