【问题标题】:Unit testing with ASP.NET MVC model binders使用 ASP.NET MVC 模型绑定器进行单元测试
【发布时间】:2009-01-06 21:40:21
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    虽然我想也许我不理解这个问题。使用表单发布变量是一种很好的方法,但是,当您需要对产品进行编辑时,这将非常有效,并且一段时间后您可能会发现让您的所有操作都采用表单发布变量并更新您的模型要容易得多。 TryUpdateModel 和 UpdateModel 值得指出的一点是,我们遇到了实体框架的错误,如果您尝试更新复杂的实体框架模型,它有时会引发异常。但是就像我们所做的那样,编写自己的模型更新器真的很容易。

    编辑:

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

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

    【讨论】:

    • 对不起,我不清楚。我想到了另一个我忘记附加到末尾的句子,但我没有。正在编辑......
    • 啊,我明白了。好吧,使用表单发布变量将帮助您测试模型绑定器....我将编辑我的帖子。
    • 我想我会听从您的建议并保持范围具体。谢谢!
    • 您只需要测试一个自定义(派生自DefaultModelBinder或实现IModelBinder)模型绑定器
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多