2012-04-03 94 views
2

在我在我的控制器的操作方法如下代码:Controller.User是空单元测试

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

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

任何人都可以提出处理这个问题的最佳方法吗?我是否必须为单元测试重构此代码?

回答

3

您可能需要将用户属性设置为设置的一部分。你可以通过ControllerContext来嘲笑HttpContextBase来创建控制器,以便返回你的模拟用户。将你的模拟ControllerContext设置为ControllerContext属性,如果你已经正确配置了对象图,它会找到User

2

Controller类的User属性是从当前HttpContext复制的 - 你必须提供一个框架,并且设置适当的User有这个在您的单元测试工作。

2

如果您运行网络请求上下文的以外的代码,用户将为空。这听起来像你正在直接对你的方法进行测试。

您有两种选择。

对于您的问题(但不一定是最可持续的修复),最快的修复方法是简单地将您的运行网站作为WebRequest从单元测试中调用。

更可持续的修复方法是将您对环境相关服务器端功能(如User)的使用收集到一个您可以模拟/伪造的类中。

编辑

任何人都可以提出来对付它的最好方法?我是否必须为单元测试重构此代码?

底线答案是“是”。更重要的是,你可能想要,因为它会让你的系统长期更灵活和/或可维护。