2011-08-13 41 views
0

我是新來的ASP.Net MVC - 我讀的書MVC和下面的代碼測試分頁的示例應用程序的書:ASP.Net MVC - Mocks做什麼?

[TestMethod] 
public void Can_Paginate() 
{ 
    // Arrange 
    // - create the mock repository 
    Mock<IProductRepository> mock = new Mock<IProductRepository>(); 
    mock.Setup(m => m.Products).Returns(new Product[] { 
         new Product {ProductID = 1, Name = "P1"}, 
         new Product {ProductID = 2, Name = "P2"}, 
         new Product {ProductID = 3, Name = "P3"}, 
         new Product {ProductID = 4, Name = "P4"}, 
         new Product {ProductID = 5, Name = "P5"} 
                 }.AsQueryable()); 
    // create a controller and make the page size 3 items 
    ProductController controller = new ProductController(mock.Object); 
    controller.PageSize = 3; 
    // Action 
    IEnumerable<Product> result = (IEnumerable<Product>)controller.List(2).Model; 
    // Assert 
    Product[] prodArray = result.ToArray(); 
    Assert.IsTrue(prodArray.Length == 2); 
    Assert.AreEqual(prodArray[0].Name, "P4"); 
    Assert.AreEqual(prodArray[1].Name, "P5"); 
} 

的問題是,什麼Mock辦?我無法直接將Product陣列傳遞給ProductController嗎?爲什麼這一輪?

回答

0

基本上mock模擬實現IProductRepository的類實例,它通過在引擎下引入一個具有相同方法和屬性的代理它們在底層接口中定義。

下面的代碼設置結果行將被返回,只要獲得Products屬性的訪問器就會被調用。

mock.Setup(m => m.Products).Returns(...); 

關於ProductController, 我相信它的構造函數有IProductRepository類型的參數,因此實例ProductController和測試它,你必須實例化一個實現IProductRepository類的實例,並通過它在控制器的構造函數,嘲諷IProductRepository的允許您專注於控制器的測試,並且不關心實現的任何細節。模擬是在測試中模擬類的依賴關係的正確方法,只需要一個接口即可。因此,您正在測試ProductController,並且所有依賴關係都被嘲笑。

0

它看起來像是使用一個模擬API(可能是Moq)來創建一個模擬的界面用於測試目的的實現。這很有用,因爲有時候真正的對象會做一些事情,比如連接到不利於測試的數據庫或其他資源。

http://code.google.com/p/moq/

3

模擬及其對應的概念,存根,用於當單元測試的應用程序。在這種情況下,它們被用來設置控制器可以用來測試其行爲的假數據。 Mocks和Stubs的概念可能會讓你頭暈目眩。

請嘗試閱讀此文由馬丁福勒稱爲Mocks aren't stubs。當單元測試您不想調用數據庫或文件系統(或者它們將是集成測試),因此我們在上面的測試代碼的實例中嘲弄對外部依賴關係

的調用,IProductRepository類被嘲笑,因爲它可能連接到數據庫。這意味着我們可以僞造它的行爲並返回我們需要返回的數據來測試剩餘的Action方法

+1

您可能還想讀kzu的「嘲笑,存根和假貨:它是一個連續體」http://blogs.clariusconsulting.net/kzu/mocks-stubs-and-fakes-its-a-continuum/ – gerryLowry

+0

@gerryLowry很好的資源鏈接! – stack72

相關問題