2011-12-15 47 views
0

我有以下体系结构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)抛出一个BusinessLogicException应用户对文档没有权利。我正在使用异常,因为这似乎是处理业务/验证违规的最佳方法(尽管我个人认为这是对异常的不良使用!)。

从控制器测试测试上述情况时,我是否应该测试是否应该抛出BusinessLogicException或发生正确的重定向(或其他),还是应该模拟未授权的用户/不存在的documentID等?在我看来,GetNewNote(User.Identity,documentID)的服务测试将是模拟未授权用户的地方,因为这可确保我的测试正在测试特定代码的核心功能。但是,如果我不写一个模拟未授权用户生成异常的控制器测试,那么看看我未来测试的人将会如何理解AddNote所需的功能是为了防止未经授权的用户添加注释。如果他们不明白这一点,他们可能会试图直接在控制器中直接初始化一个新的Note,而不是通过noteService.GetNewNote(User.Identity,documentID)来初始化。

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

回答

0

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

+0

但是,然后我的控制器测试不会明确表示用户必须有权访问指定的文档。因此,任何在将来维护应用程序的人都不会意识到通过服务创建新笔记以在控制器中直接创建新笔记的重要性 - 如果他们进行此更改但不需要测试会中断,但需要绕过业务逻辑。 – James 2011-12-15 09:49:02