2011-12-15 49 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