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

时间:2009-01-06 21:40:22

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

我想知道使用模型绑定的单元测试控制器操作的最佳实践。

[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-Gets。我能想到的唯一解决方案是接受namevalue集合(表单数据)并使用UpdateModel / TryUpdateModel。

我还想测试模型绑定本身是否正常工作,所以我想将创建新产品的责任交给模型绑定器。

2 个答案:

答案 0 :(得分:4)

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

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

    // Test the results
}

虽然我想也许我不理解这个问题。使用表单后置变量是一种很好的方法,但是当您需要对产品进行编辑时,这将非常有效。过了一段时间后,您可能会发现让所有操作更容易采用表单后置变量并更新模型。使用TryUpdateModel和UpdateModel值得指出的一件事是我们遇到了Entity Framework的错误,如果你试图更新一个复杂的权限框架模型,它有时会抛出异常。但是,正如我们所做的那样,编写自己的模型更新程序非常容易。

编辑:

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

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

答案 1 :(得分:1)

现在您刚刚向控制器提供了一个ValueProvider。