Asp.Net MVC教程单元测试 - 史蒂夫桑德森

时间:2013-10-10 14:45:07

标签: c# asp.net-mvc unit-testing

我正在研究Steve Sanderson的书籍Pro ASP.NET MVC Framework,我遇到了一个产生错误的单元测试问题。

在下面的例子中,它测试了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。

有没有人遇到类似的问题或者让测试通过?

1 个答案:

答案 0 :(得分: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)

本书随后陈述“我们已经改变了List动作方法的签名,这将阻止我们现有的单元测试方法的一些编译。为了解决这个问题,在这些单元测试中将null作为第一个参数传递给List方法与控制器一起工作。“ - Pg。 203