0

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

Mock<ISurveyRepository> mock = new Mock<ISurveyRepository>();

并继续模拟存储库调用。其中第一个是:

int userId = repository.GetUserId(User.Identity.Name);

所以我将它添加到我的测试方法中:

mock.Setup(y => y.GetUserId("testName")).Returns(1);

不幸的是,这行代码给了我:

System.NullReferenceException: Object reference not set to an instance of an object.

如果我从控制器中删除上面的行并改用静态值(int userId = 1),则测试可以正常完成。

谁能告诉我为什么?

4

2 回答 2

1

这可能无法解决您的起订量问题,但就其价值而言,MvcContrib 测试助手对于模拟登录用户非常有用。

使用测试助手,您可以编写如下代码:

FakeIdentity FakeId = new FakeIdentity(UserName);
FakeUser = new FakePrincipal(FakeId, new[] {  "Admin" });   
Thread.CurrentPrincipal = FakeUser;

模拟用户。希望这可以帮助。

于 2012-11-09T16:47:50.477 回答
0

当您获取用户名时,您的代码会引发异常。User从当前 HTTP 请求返回安全信息。在测试期间,您没有 HTTP 请求,因此此代码会引发异常。

这是此属性的实现:

public IPrincipal User
{
    get
    {
        if (HttpContext != null)            
            return HttpContext.User;

        return null;
    }
}

因此,如您所见,如果没有 HttpContext,它会返回 null。因此,您需要设置 HttpContext 并IPrincipal为您的测试提供模拟。请参阅此处如何创建假 HttpContext。

于 2012-11-09T16:55:07.847 回答