在单元测试期间,Controller.User为空

时间:2012-04-03 16:30:30

标签: asp.net asp.net-mvc unit-testing

我的控制器操作方法中有以下代码:

if (User.Identity.IsAuthenticated)
{
    // ...
}

似乎工作正常。但是当我运行一个调用此操作的单元测试时,它会失败,因为User为空?

有人能建议最好的方法来解决这个问题吗?我是否必须重新构建此代码以进行单元测试?

3 个答案:

答案 0 :(得分:3)

您可能需要将User属性设置为设置的一部分。您可以通过模拟用于创建控制器的HttpContextBase via ControllerContext来执行此操作,以便它返回您的模拟用户。将模拟的ControllerContext设置为ControllerContext属性,只要您正确配置了对象图,它就会找到User

答案 1 :(得分:2)

User类的Controller属性是从当前HttpContext复制的 - 您必须提供一个上下文并在此处设置User,以便在此工作你的单元测试。

答案 2 :(得分:2)

如果您运行Web请求上下文的外部,则用户将为null。听起来你正在直接对你的方法进行测试。

您有两种选择。

对您的问题进行最快速的解决,但不一定是最可持续的解决方案,只需将您的运行网站作为WebRequest从单元测试中调用即可。

更可持续的解决方案是将您对依赖于上下文的服务器端功能(例如User)的使用收集到您可以模拟/伪造的单个类中。

修改

  

有人能建议最好的方法来解决这个问题吗?我是否必须重新构建此代码以进行单元测试?

底线答案是“是”。更重要的是,您可能希望这样做,因为从长远来看,它将使您的系统更加灵活和/或可维护。