c# - 使用 ASP.NET MVC 模型绑定(bind)器进行单元测试

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

我想知道利用模型绑定(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/

相关文章:

c# - 将密码存储在 cookie 中是否安全?

python - 如何模拟函数以返回带有属性的响应?

java - 在单元测试中禁用 JMS 使用 bean

asp.net-mvc - 为什么 AntiForgeryToken 隐藏字段与我机器上的 cookie 不同?

javascript - 如何在 AngularJS 单元测试中触发 ui-sref?

c# - 在主键中创建带有 DateTime 的实体

c# - 最后用缓动来回摇动一个物体?

c# - 使用 MySqlConnector for .NET 是否完全支持 TransactionScope 对象?

c# - 动态对象属性填充器(无反射)

javascript - 上传文件 jQuery ajax MVC