C# 在MVC4中模拟User.Identity.Name

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

我正在尝试为控制器(MVC4)中的一个方法编写测试。我用最小起订量。在测试方法中,我为我的存储库创建了一个模拟,如下所示:

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