模拟HttpContext.Current.User.Identity.Name

时间:2016-05-10 11:31:47

标签: c# moq httpcontext xunit

我目前正在为我的项目编写单元测试,我在定义的时间使用HttpContext.Current.User.Identity.Name。不幸的是,当我运行测试时,HttpContext为空,我无法进行测试。

我已经尝试过在互联网上找到的一些解决方案,例如Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("rmllcc"), new string[0]);,但我无法解决问题。

我使用Forms Authenticate systemxUnitMoq。我没有测试控制器,而是Repository,我只是在每次用户使用特定方法时进行记录。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:3)

我建议您不要使用存储库中的HttpContext,创建自己的上下文类或包装用户属性的接口。

这样的事情:

 public class MyContext
    {
        public MyContext(string username)
        {
            Username = username;
        }

        public string Username { get; private set; }

        public static MyContext CreateFromHttpContext(HttpContext httpContext){
            return new MyContext(HttpContext.Current.User.Identity.Name);
        }
    }


 public class MyRep
    {
        private readonly VtContext _context;

        public MyRep(MyContext context)
        {
            _context = context;
        }

        ... other repository code...

    }

然后在测试中创建一个MyContext

var rep = new MyRep(new MyContext("unittest"));

答案 1 :(得分:2)

聆听您的测试告诉您的内容:使用此测试难以编写以考虑代码结构的事实。您已在存储库层中向Web应用程序引入了依赖项。那不好。您的存储库中还有两件事情:数据访问和日志记录。

也许将当前用户包装在一个抽象中,该抽象将获得您需要的用户,但可以很容易地存根。或者您可以将存储库包装在为您执行日志记录的装饰器中。

对不起,这不是问题的直接答案,但是,当测试很难写时,通常会有更深层次的根本原因需要解决。