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# - Orchard 。如何渲染 'HeadScripts' 形状之前的东西?

c# - 带有 NOLOCK 的 Entity Framework

c# - 具有动态参数的 MVC 分部方法

asp.net-mvc - Identity Server 4 将参数添加到登录页面

c# - Autofac、单元测试、C# - Autofac Moq 和 FakeItEasy 集成包之间的区别

c# - 如何将数据发布到网站

c# - ASP.NET Core 本地化小数字段点和逗号

asp.net - ErrorMessageResourceName 和 ErrorMessage 不能同时设置,但我只设置一个

swift - 单元测试 Swift,info.plist 的 CoreLocation 问题

unit-testing - 如何在 clojure 中模拟宏以进行测试?