模拟 HttpContext.Current.User.Identity.Name
Mock HttpContext.Current.User.Identity.Name
我目前正在为我在指定时间使用 HttpContext.Current.User.Identity.Name
的项目编写单元测试。不幸的是,我无法进行测试,因为当我 运行 测试时 HttpContext
为空。
我已经尝试了一些我在互联网上找到的解决方案,例如 Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("rmllcc"), new string[0]);
,但我无法让它工作。
我正在使用 Forms Authenticate system
、xUnit
和 Moq
。我不是在测试控制器,而是在 Repository
中,我只是在每次用户使用特定方法时进行登录。我怎么能做到这一点?
听听你的测试告诉你什么:利用这个测试很难编写的事实来考虑你的代码结构。您已经在您的存储库层中引入了对 Web 应用程序的依赖。这不好。您的存储库中还有两件事正在进行:数据访问和日志记录。
也许将当前用户包装在一个抽象中,这将获得您需要的用户,但很容易被存根。或者您可以将存储库包装在一个为您进行日志记录的装饰器中。
抱歉,这不是问题的直接答案,但是,当难以编写测试时,通常有更深层次的根本原因需要解决。
我建议您不要使用存储库中的 HttpContext,创建自己的上下文 class 或包装用户的接口-属性。
像这样:
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"));
我目前正在为我在指定时间使用 HttpContext.Current.User.Identity.Name
的项目编写单元测试。不幸的是,我无法进行测试,因为当我 运行 测试时 HttpContext
为空。
我已经尝试了一些我在互联网上找到的解决方案,例如 Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("rmllcc"), new string[0]);
,但我无法让它工作。
我正在使用 Forms Authenticate system
、xUnit
和 Moq
。我不是在测试控制器,而是在 Repository
中,我只是在每次用户使用特定方法时进行登录。我怎么能做到这一点?
听听你的测试告诉你什么:利用这个测试很难编写的事实来考虑你的代码结构。您已经在您的存储库层中引入了对 Web 应用程序的依赖。这不好。您的存储库中还有两件事正在进行:数据访问和日志记录。
也许将当前用户包装在一个抽象中,这将获得您需要的用户,但很容易被存根。或者您可以将存储库包装在一个为您进行日志记录的装饰器中。
抱歉,这不是问题的直接答案,但是,当难以编写测试时,通常有更深层次的根本原因需要解决。
我建议您不要使用存储库中的 HttpContext,创建自己的上下文 class 或包装用户的接口-属性。
像这样:
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"));