我的控制器操作方法中有以下代码:
if (User.Identity.IsAuthenticated)
{
// ...
}
似乎工作正常。但是当我运行一个调用此操作的单元测试时,它会失败,因为User
为空?
有人能建议最好的方法来解决这个问题吗?我是否必须重新构建此代码以进行单元测试?
答案 0 :(得分:3)
您可能需要将User属性设置为设置的一部分。您可以通过模拟用于创建控制器的HttpContextBase
via ControllerContext
来执行此操作,以便它返回您的模拟用户。将模拟的ControllerContext
设置为ControllerContext
属性,只要您正确配置了对象图,它就会找到User
。
答案 1 :(得分:2)
User
类的Controller
属性是从当前HttpContext
复制的 - 您必须提供一个上下文并在此处设置User
,以便在此工作你的单元测试。
答案 2 :(得分:2)
如果您运行Web请求上下文的外部,则用户将为null。听起来你正在直接对你的方法进行测试。
您有两种选择。
对您的问题进行最快速的解决,但不一定是最可持续的解决方案,只需将您的运行网站作为WebRequest从单元测试中调用即可。
更可持续的解决方案是将您对依赖于上下文的服务器端功能(例如User
)的使用收集到您可以模拟/伪造的单个类中。
修改
有人能建议最好的方法来解决这个问题吗?我是否必须重新构建此代码以进行单元测试?
底线答案是“是”。更重要的是,您可能希望这样做,因为从长远来看,它将使您的系统更加灵活和/或可维护。