【发布时间】:2011-12-15 09:30:06
【问题描述】:
我有一个具有以下架构 MVC 应用程序 > 服务 > 存储库的解决方案。现在假设我有一个文档模型,一个文档有很多注释。我有一个带有 AddNote(documentID) 操作的 Notes 控制器。现在我的业务规则说只有与文档关联的用户才能添加注释,所以我强制执行此操作。我目前正在使用以下方法:
public ActionResult AddNote(int documentID)
{
try
{
NoteCreateEditViewModel viewModel = Mapper.Map<Note, NoteCreateEditViewModel>(noteService.GetNewNote(User.Identity, documentID));
return View(viewModel);
}
catch (BusinessLogicException validationException)
{
// Send user somewhere else.
}
}
noteService.GetNewNote(User.Identity, documentID) 如果用户对 Document 没有权限,则会引发 BusinessLogicException。我正在使用异常,因为这似乎是处理业务/验证违规的最佳方式(尽管我个人认为这是对异常的不好使用!)。
当从控制器测试中测试上述内容时,我应该只是测试如果抛出 BusinessLogicException 会发生正确的重定向(或其他),还是应该模拟未经授权的用户/不存在的 documentID 等?在我看来,GetNewNote(User.Identity, documentID) 的服务测试将是模拟未经授权的用户的地方,因为这可以确保我的测试正在测试特定代码的核心功能。
但是,如果我不编写模拟未经授权的用户生成异常的控制器测试,那么将来查看我的测试的人将如何理解 AddNote 所需的功能是防止未经授权的用户添加注释。如果他们不理解这一点,他们可能会想直接在控制器中简单地初始化一个新 Note,而不是通过 noteService.GetNewNote(User.Identity, documentID)。
那么我应该在我的控制器中进行更多测试,还是在添加关联模型方面有更简单的设计?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 unit-testing