2013-10-10 33 views
-2

我正在通過史蒂夫桑德森的書Pro ASP.NET MVC框架和我有一個單元測試產生錯誤的問題。Asp.Net MVC教程單元測試 - 史蒂夫桑德森

在下面的例子中,它測試了Paginate。

[TestMethod] 
public void Can_Paginate() 
{ 

     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()); 

     ProductController controller = new ProductController(mock.Object);  
     controller.PageSize = 3; 

     IEnumerable<Product> result = (IEnumerable<Product>)controller.List(2).Model; 

     Product[] prodArray = result.ToArray(); 
     Assert.IsTrue(prodArray.Length == 2); 
     Assert.AreEqual(prodArray[0].Name, "P4"); 
     Assert.AreEqual(prodArray[0].Name, "P5"); 
} 

消息錯誤是:

試驗方法UnitTestProject3.Peginate.Can_Peginate拋出異常: System.NullReferenceException。

有沒有人遇到類似的問題或得到測試通過?

+2

它說哪一行? – ysrb

+1

您可以在控制器上發佈List方法的代碼? –

+1

你不會在書中學習編程,你可以通過理解你在做什麼以及編譯器告訴你什麼來編程,你可以解釋什麼是NullReferenceException,以及如何調試和消除它們[這裏](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net-and-how-do-i-fix-it)。 – CodeCaster

回答

1

你做了幾個錯別字和需要更新這些行:

ProductListViewModel result = (ProductsListViewModel)controller.List(null, 2).Model; 

Assert.AreEqual(prodArray[1].Name, "P5"); 

在ProductsController類,本教程有您更新的ViewResult這樣:

public ViewResult List(string category, int page = 1) 

該書然後陳述「我們已經改變了列表動作方法的簽名,這將p避免編譯我們現有的單元測試方法。要解決這個問題,在作爲控制器的單元測試中,將null作爲第一個參數傳遞給List方法。「 - 第203頁

+0

爲什麼? – Liam

+0

@Liam我已經做了教程。你爲什麼downvote? – Andrew

+0

但它肩不過拋出System.NullReferenceException。 PS我沒有downvote。 – ysrb