控制器测试服务层逻辑

时间:2011-12-15 09:30:06

标签: asp.net-mvc asp.net-mvc-3 unit-testing

我有以下架构MVC应用程序的解决方案>服务>库。现在假设我有一个文档模型,一个文档有很多Notes。我有一个带有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)。

那么我应该在我的控制器中测试更多,还是在添加相关模型时有更简单的设计?

1 个答案:

答案 0 :(得分:0)

在您的单元测试中,您应该模拟noteService.GetNewNote方法调用,以便抛出BusinessLogicException。然后声明控制器操作返回了重定向结果。