C# 使用.NETCore2和Moq,如何设置HTTP上下文以伪造身份验证?

C# 使用.NETCore2和Moq,如何设置HTTP上下文以伪造身份验证?,c#,unit-testing,authentication,moq,.net-core-2.0,C#,Unit Testing,Authentication,Moq,.net Core 2.0,我正在使用Moq在我的.net core 2应用程序中进行自动测试。我们使用承载身份验证,需要能够从HttpContext对象中提取名称,以确保我们拥有正确的用户: var userName = HttpContext.User.Identity.Name; 我已经找到了大量使用System.Web的示例,但没有一个可以让我模拟Core 2设置。好的,所以在从一些旧链接(即)拼凑出帮助后,我能够让它正常工作,我想我会将它发布在这里供后代使用: public class ContextHelpe

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

var userName = HttpContext.User.Identity.Name;

我已经找到了大量使用System.Web的示例,但没有一个可以让我模拟Core 2设置。

好的,所以在从一些旧链接(即)拼凑出帮助后,我能够让它正常工作,我想我会将它发布在这里供后代使用:

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;
    }
}

您可以实现同样的功能,而无需模拟任何内容,也无需使用框架提供的现有类

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;
    }
}

仅仅因为我们有能力模仿某些东西并不意味着我们大多数时候都要模仿。

我喜欢这里的整洁。我相信,我的回答将允许您模拟上下文对象的其他部分,但出于我的需要,这是完美的。谢谢
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;
    }
}