在我在我的控制器的操作方法如下代码:Controller.User是空单元测试
if (User.Identity.IsAuthenticated)
{
// ...
}
这似乎很好地工作。但是当我运行一个调用此操作的单元测试时,它会失败,因为User
为空?
任何人都可以提出处理这个问题的最佳方法吗?我是否必须为单元测试重构此代码?
在我在我的控制器的操作方法如下代码:Controller.User是空单元测试
if (User.Identity.IsAuthenticated)
{
// ...
}
这似乎很好地工作。但是当我运行一个调用此操作的单元测试时,它会失败,因为User
为空?
任何人都可以提出处理这个问题的最佳方法吗?我是否必须为单元测试重构此代码?
您可能需要将用户属性设置为设置的一部分。你可以通过ControllerContext
来嘲笑HttpContextBase
来创建控制器,以便返回你的模拟用户。将你的模拟ControllerContext
设置为ControllerContext
属性,如果你已经正确配置了对象图,它会找到User
。
的Controller
类的User
属性是从当前HttpContext
复制的 - 你必须提供一个框架,并且设置适当的User
有这个在您的单元测试工作。
如果您运行网络请求上下文的以外的代码,用户将为空。这听起来像你正在直接对你的方法进行测试。
您有两种选择。
对于您的问题(但不一定是最可持续的修复),最快的修复方法是简单地将您的运行网站作为WebRequest从单元测试中调用。
更可持续的修复方法是将您对环境相关服务器端功能(如User
)的使用收集到一个您可以模拟/伪造的类中。
编辑
任何人都可以提出来对付它的最好方法?我是否必须为单元测试重构此代码?
底线答案是“是”。更重要的是,你可能想要,因为它会让你的系统长期更灵活和/或可维护。