为什么我会对这个控制器的动作进行单元测试?

时间:2009-12-17 19:00:12

标签: asp.net-mvc tdd nunit moq

我有一个ArticleController,它根据类别显示文章列表。

public ActionResult List(string categoryname)
{
       MyStronglyTypedViewData vd = new MyStronglyTypedViewData();

       DBFactory factory = new DBFactory();

       categoryDao = factory.GetCategoryDao();
       articleDao = factory.GetArticleDao();


       vd.Category = categoryDao.GetByName(categoryname);
       vd.Articles = articleDao.GetByCategoryId(vd.Category.Id);


       return View(vd);
}

如果我要对这个动作进行单元测试,究竟是什么目的呢? 确保正在打开正确的视图?

4 个答案:

答案 0 :(得分:8)

  1. 确保返回ViewResult
  2. 确保视图结果具有模型
  3. 确保此模型不为null且类型为MyStronglyTypedViewData
  4. 在模型上断言属性
  5. 这一行DBFactory factory = new DBFactory();让我觉得编写单元测试很困难,因为你没有使用可以被模拟的接口,而是依赖于可能击中实际数据库的具体类。

答案 1 :(得分:3)

还要考虑错误情况:categoryname是来自网络的字符串。如果用户通过“坏”操作,该操作应该如何表现?在我看来你可能会得到一个空引用错误?

将错误案例作为功能案例进行测试同样重要。

答案 2 :(得分:1)

测试categoryDao.GetByName(categoryname);articleDao.GetByCategoryId(vd.Category.Id);返回的对象中的各种边缘情况。测试它们抛出异常时会发生什么

另外,如果你认为你的设计可以更好,如果它坚持Dependency Inversion Principle(我只是说“如果”;你是否应该相信这是一个单独的问题),那么试着写一个井对您的方法进行隔离单元测试并打破依赖关系可能是一项有用的练习,可以改进您的程序设计。

答案 3 :(得分:1)

这是我们团队得出的结论,即每个控制器必须验证的内容(我们使用BDD):

  • 验证每个操作都返回正确的视图名称。
    • 如果操作可以返回多个视图,请验证是否已正确触发并返回每个ViewName。
    • 验证返回的ViewData已完全填充并输入正确。
  • 验证控制器是否存在正确的异常。
    • 验证从服务/模型冒出的所有RuleViolation都包含在ViewData中。 (这不仅仅是请求中的数据约束违规)