C# 在MVC4中模拟User.Identity.Name
我正在尝试为控制器(MVC4)中的一个方法编写测试。我用最小起订量。在测试方法中,我为我的存储库创建了一个模拟,如下所示:C# 在MVC4中模拟User.Identity.Name,c#,asp.net-mvc,unit-testing,moq,C#,Asp.net Mvc,Unit Testing,Moq,我正在尝试为控制器(MVC4)中的一个方法编写测试。我用最小起订量。在测试方法中,我为我的存储库创建了一个模拟,如下所示: Mock<ISurveyRepository> mock = new Mock<ISurveyRepository>(); 因此,我将此添加到我的测试方法中: mock.Setup(y => y.GetUserId("testName")).Returns(1); 不幸的是,这行代码给了我: System.NullReferenceExce
Mock<ISurveyRepository> mock = new Mock<ISurveyRepository>();
因此,我将此添加到我的测试方法中:
mock.Setup(y => y.GetUserId("testName")).Returns(1);
不幸的是,这行代码给了我:
System.NullReferenceException: Object reference not set to an instance of an object.
如果我从控制器中删除上面的行并使用静态值(intuserid=1),测试就可以完成
有人能告诉我为什么吗?这可能无法解决您的最低起订量问题,但不管它值多少,它对于模拟登录用户非常有用 使用Test Helper,您可以编写如下代码:
FakeIdentity FakeId = new FakeIdentity(UserName);
FakeUser = new FakePrincipal(FakeId, new[] { "Admin" });
Thread.CurrentPrincipal = FakeUser;
模仿用户。希望这有帮助。当您获取用户名时,代码会引发异常<代码>用户从当前HTTP请求返回安全信息。在测试期间,您并没有HTTP请求,因此此代码引发异常 以下是此属性的一个实现:
public IPrincipal User
{
get
{
if (HttpContext != null)
return HttpContext.User;
return null;
}
}
因此,如您所见,如果没有HttpContext,它将返回null。因此,您需要设置HttpContext并为测试提供模拟的IPrincipal
。请参见如何创建假HttpContext
public IPrincipal User
{
get
{
if (HttpContext != null)
return HttpContext.User;
return null;
}
}