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

时间:2018-07-31 21:54:38

标签: c# unit-testing authentication moq .net-core-2.0

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

var userName = HttpContext.User.Identity.Name;

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

2 个答案:

答案 0 :(得分:7)

您可以完成相同的事情而无需模拟任何东西并使用框架提供的现有类。

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

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

答案 1 :(得分:3)

好吧,所以在整理了一些较旧的链接(例如Setting HttpContext.Current.Session in a unit test)的帮助后,我能够使此工作正常进行,以为我可以在此发表以供后代使用:

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