gpt4 book ai didi

asp.net-mvc - 哪种模型绑定(bind)方法在 ASP.NET MVC 中具有最佳的单元测试语义?

转载 作者:行者123 更新时间:2023-12-04 21:01:08 25 4
gpt4 key购买 nike

定义

在 ASP.NET MVC 中,有两种方法可以在操作中进行模型绑定(bind)。我们将这些称为“绑定(bind)参数方式”和“UpdateModel 方式”。他们都做几乎完全相同的事情,而且他们以几乎完全相同的方式做这件事:

    public ActionResult UpdateWithBindArguments(Foo model)
{
Repository.Update(model);
// error handling removed
return RedirectToAction(...)
}

public ActionResult UpdateWithUpdateModel()
{
Foo model;
UpdateModel(model); // part of MVC framework
Repository.Update(model);
// error handling removed
return RedirectToAction(...)
}

正如我所说,这些几乎完全相同。第一个可能更具可读性,但我可以克服它。

两种测试方法

我认为,重要的区别在于您如何对它们进行单元测试:
    [TestMethod]
public void TestUpdateWithBindArguments()
{
var model = new Foo() { PropertyName = "Bar" };
var controller = new FooController();

var result = controller.UpdateWithBindArguments(model);

// assert
}

[TestMethod]
public void TestUpdateWithUpdateModel()
{
var formData = new FormCollection() { { "PropertyName", "Bar" } };
var controller = new FooController();
controller.ValueProvider = formData.ToValueProvider();

var result = controller.UpdateWithUpdateModel();

// assert
}

第一种方法使用强静态类型构建模型。第二个使用名称/值对构造提交的用户数据。我发现第一种方法更容易阅读,但第二种方法更接近于网站调用 Controller 时实际发生的情况。

出于这个问题范围之外的原因,我从来没有说服人们应该使用 lambda 表达式而不是字符串来构建 aspx 页面来进行模型绑定(bind)。我很乐意与您讨论,但我们不要在这里讨论。出于这个问题的目的,让我们理所当然地认为我将使用内置的 HtmlHelper 方法,这些方法采用字符串而不是采用 lambda 表达式的扩展。因此,第二种方法使用名称/值对作为针对 aspx 页面的“动态”性质的非正式测试具有一定的值(value)。当然,它不能取代针对站点的集成测试。

问题(终于!)

我看到了这两种方法的优点和缺点。我的问题是,是否有一个非常有力的论据支持我缺少的一种方法?

编辑 我正在寻找客观的答案。我正在寻找为什么一种方法比另一种更好的非显而易见的原因,而不是试图进行民意调查。

最佳答案

在测试方面,在我看来,将对象直接传递给 action 方法更自然。无需填充 ValueProviderDictionary。

需要其他方法的原因是您可能需要控制要绑定(bind)的对象的实例化。 DefaultModelBinder 只是查找默认构造函数并调用它。

但在某些情况下,您可能需要在将对象绑定(bind)到表单值之前自己创建对象。这就是 UpdateModel 发挥作用的地方。

关于asp.net-mvc - 哪种模型绑定(bind)方法在 ASP.NET MVC 中具有最佳的单元测试语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/520793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com