代码之家  ›  专栏  ›  技术社区  ›  Chad Moran

使用ASP.NET MVC模型绑定进行单元测试

  •  2
  • Chad Moran  · 技术社区  · 17 年前

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult AddProduct(Product product)
    {
    }
    

    public void Catalog_AddProduct()
    {
        CatalogController controller = new CatalogController();
        // some mocking for controller context, setting form values etc...
        controller.AddProduct(// ?);
    }
    

    有些人可能建议将Product作为参数删除,但我还有另一个AddProduct控制器操作,仅用于HTTP GET。我能想到的唯一解决方案可能是接受namevalue集合(表单数据)并只使用UpdateModel/TryUpdateModel。

    2 回复  |  直到 17 年前
        1
  •  4
  •   Odd    17 年前

    我不确定我是否理解这个问题,为什么你不能这样做:

    [TestMethod()]
    public void AddProductTest()
    {
        CatalogController target = new CatalogController(/*testing variables*/);
        target.AddProduct(new Product { /* product details for testing */ });
    
        // Test the results
    }
    

    虽然我想我可能不理解这个问题。使用form post变量是一种很好的方法,但是,当您需要编辑产品时,这将非常有效,过一段时间后,您可能会发现让您的所有操作都使用form post变量并更新您的模型要容易得多。TryUpdateModel和UpdateModel值得指出的一点是,我们在实体框架中遇到了一个bug,如果您尝试更新一个复杂的实体框架模型,它有时会抛出异常。但是,正如我们所做的那样,编写自己的模型更新程序非常容易。

    我不确定您是否能够或者是否需要测试模型绑定本身。模型绑定是MVC框架的一部分,不在控制器测试的范围之内,我不关心它,并且假设它将在测试的上下文中工作。

    如果您真的需要测试模型绑定,我知道的唯一方法是传入表单post变量,然后使用TryUpdateModel方法。

        2
  •  1
  •   Scott Hanselman    17 年前