【问题标题】:Unit-testing model changes in Asp.net MVC 3Asp.net MVC 3 中的单元测试模型更改
【发布时间】:2011-06-14 01:40:18
【问题描述】:

我有一个ProductController 类和一个Product 模型。每次调用ProductController 中的Create 操作时,它都会基于FormCollection 创建一个新的Product,然后它会调用Product 内部的一个函数来更改日期:

[HttpPost]
public ActionResult Create(FormCollection form)
{
    Product product = new Product();
    TryUpdateModel(product, form);

    if(ModelState.IsValid)
    {
        product.ChangeDate(form["date"]);
        repository.SaveProduct(product);

        return RedirectToAction("Index");
    }
    else
        return View();
}

我想知道如何测试Product,所以我知道.ChangeDate 正在被调用(通过Moq 的Verify)。我没有使用 Asp.Net 自动模型绑定,因为我想通过TryUpdateModel 捕获任何绑定异常。我不确定我是否应该将 .ChangeDate 放在 Controller 或 Repository 类中。我正在使用 Moq、MVC3 和 Entity Framework 4。感谢任何帮助!

谢谢, 亚历克斯

【问题讨论】:

    标签: asp.net-mvc unit-testing entity-framework asp.net-mvc-3 modeling


    【解决方案1】:

    您可以在模拟存储库的SaveProduct 方法上设置期望,以便使用特定参数调用它。这个特定的参数将是在控制器动作内部构造的产品。然后您可以断言该对象的Date 属性与您在表单集合中的Create 操作中作为参数传递的属性相同。

    var mock = new Mock<IRepository>();
    mock.Setup(
        x => x.SaveProduct(
            It.Is<Product>(p => p.Date == someExpectedDate)
        )
    );
    

    【讨论】:

    • 谢谢,达林。我从来没想过这点!有没有办法设置多个期望?所以不仅检查日期吗?只是想知道以供将来参考...
    • @Alex,当然:p.Date == someExpectedDate &amp;&amp; p.Foo == "bar" &amp;&amp; ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多