我想知道利用模型绑定(bind)进行单元测试 Controller 操作的最佳实践。
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult AddProduct(Product product)
{
}
我想知道如何调用 Controller 的方法进行单元测试。如果你尝试这样的事情......
public void Catalog_AddProduct()
{
CatalogController controller = new CatalogController();
// some mocking for controller context, setting form values etc...
controller.AddProduct(// ?);
}
有些人可能建议删除 Product 作为参数,但是,我还有另一个仅用于 HTTP-Gets 的 AddProduct Controller 操作。我能想到的唯一解决方案可能是接受名称值集合(表单数据)并仅使用 UpdateModel/TryUpdateModel。
我还想测试模型绑定(bind)本身是否正常工作,因此我想将创建新产品的责任交给模型绑定(bind)程序。
最佳答案
我不确定我是否理解这个问题,为什么你不能这样做:
[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 中遇到了一个错误,如果您尝试更新复杂的 Entity Framework 模型,有时会引发异常。但像我们一样编写自己的模型更新程序确实很容易。
编辑:
我不确定您是否能够或是否需要测试模型绑定(bind)本身。模型绑定(bind)是 MVC 框架的一部分,并且超出了 Controller 测试的范围,我不会关心它并假设它会在您的测试上下文中工作。
如果您确实需要测试模型绑定(bind),我知道的唯一方法是传入表单 post 变量,然后使用 TryUpdateModel 方法。
关于c# - 使用 ASP.NET MVC 模型绑定(bind)器进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/418284/