0

我使用MVC 2與MVC contrib和Rhino mocks。ASP.NET MVC 2:在視圖和控制器中測試什麼

我需要幫助。這是一個痛苦的週末。我一直在尋找關於如何在使用MVC contrib的控制器上測試的好文章。沒有人對我有任何正確的答案。我想知道我需要在視圖和控制器上測試什麼?這是單元測試還是集成測試?

讓我來描述一下我的基本場景:我有一個有網格的索引視圖。在這個網格中,我有一個新聞項目列表。在這個網格中,在每一行的最後一列,是一個編輯鏈接,它將用戶帶到EditNews視圖來編輯選定的新聞項目。此外,在此索引視圖中還有一個添加新聞按鈕,可將用戶引導至CreateNews視圖。

現在給出當前情景,我需要寫什麼樣的測試?請你們也請指出他們是單元測試還是集成測試。我是否需要爲編輯鏈接編寫測試?我是否需要爲「添加新聞」按鈕編寫測試?我是否需要編寫測試來檢查用戶是否被允許在此索引頁上?這是我目前有:

[Test] 
public void Index_Should_Redirect_To_Error_View_When_User_Does_Not_Have_Permission() 
{ 
} 

[Test] 
public void Index_Should_Log_Exception_When_User_Does_Not_Have_Permission() 
{ 
} 

[Test] 
public void Index_Should_Return_Default_View() 
{ 
    // Act 
    var result = newsController.Index(); 

    // Assert 
    result 
     .AssertViewRendered() 
     .ForView("Index"); 
} 

更新: 這裏是我Index操作方法:

public ActionResult Index() 
{ 
    IEnumerable<News> news = newsRepository.FindAll(); 
    return View(news); 
} 

什麼像樣的文章或示例代碼,將不勝感激。同樣在MVC貢獻中,代碼示例沒有多大用處。我希望聽到儘可能多的意見。

謝謝。

回答

1

您需要區分單元測試,集成測試和Web測試。單元測試用於測試代碼的不同組件,例如獨立地控制器操作。集成測試用於測試代碼與外部組件(如從數據庫讀取和寫入數據的存儲庫)之間的集成,Web測試用於測試應用程序的整個用戶場景,例如用戶在地址欄中鍵入某個地址他的瀏覽器,點擊某個按鈕,...

MVCContrib.TestHelper和Rhino Mocks旨在簡化您的單元測試。所以在你的情況下,你應該測試你的控制器動作。如果沒有顯示這個控制器操作的代碼,很難說你需要測試什麼。一般來說,你可以在控制器動作中進行單元測試,它可以驗證輸入,調用存儲庫中的正確方法,並根據結果返回適當的視圖。

因此,讓我們假設你有以下索引操作你願意測試:

public class HomeController: Controller 
{ 
    private readony INewRepository _repository; 
    public HomeController(INewRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     var news = _repository.GetNews(); 
     return View(news); 
    } 
} 

以及相應的單元測試:

[TestClass] 
public class HomeControllerTests : TestControllerBuilder 
{ 
    private HomeController _sut; 
    private INewsRepository _repositoryStub; 

    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     _repositoryStub = MockRepository.GenerateStub<INewsRepository>(); 
     _sut = new UsersController(_repositoryStub); 
     InitializeController(_sut); 
    } 

    [TestMethod] 
    public void UsersController_Index_Should_Fetch_News_From_Repository() 
    { 
     // arrange 
     var news = new News[0]; 
     _repositoryStub.Stub(x => x.GetNews()).Return(news); 

     // act 
     var actual = _sut.Index(); 

     // assert 
     actual 
      .AssertViewRendered() 
      .WithViewData<News[]>() 
      .ShouldBe(news); 
    } 
} 

至於你的觀點而言,你需要編寫Web測試以驗證它們的行爲如預期。如果您擁有終極版本的Visual Studio,有不同的工具可以幫助您,例如Selenium或直接使用Web Tests。史蒂文桑德森還proposed an interesting approach測試意見,你可以看看。

+0

查看更新後的帖子。我仍然不明白這一點。我在上面提到的測試,到目前爲止是在線?你還有什麼單元測試和集成測試?如果你可以提供一些樣品,那麼我會讚賞這一點。 – 2010-12-05 09:57:29