c# - TryUpdateModel 仅在更新子对象的单元测试中失败

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

我能够让以下代码在服务器上运行,但不能在单元测试中运行。在单元测试中,简单属性设置正确,但子对象设置不正确。我已经用头撞墙太久了,所以欢迎任何建议。

Controller :

[HttpPost]
public bool Save(int id)
{
        var itemFromRepository = this.itemRepository.FetchById(id);

        if (itemFromRepository != null)
        {
            this.TryUpdateModel(
                itemFromRepository,
                "Item",
                new[] { 
                    "AnIntProperty", 
                    "AStringProperty",
                    "Category.Id"
                });

            if (itemFromRepository.Category!= null)
            {
                itemFromRepository.Category= this.categoryRepository.FetchById(itemFromRepository.Category.Id);
            }

            if (ModelState.IsValid)
            {
                this.itemRepository.Update(itemFromRepository);
                return true;
            }
        }

        return false;
}

单元测试:

    this._controller.ControllerContext = new ControllerContext();
    Item item = this.items.First();
    var updatedCategory = this.categories.Last();
    var updatedStringProperty = "Fake Value";
    var updatedIntProperty = 4;

    var formValues = new FormCollection {
        { "Item.AnIntProperty", updatedStringProperty},
        { "Item.Category.Id", updatedCategory.Id.ToString() },
        { "Item.AStringProperty", updatedIntProperty.ToString() }
    };

    var result = this._controller
        .WithIncomingValues(formValues)
        .Save(item.Id);

这通过了:

    Assert.That(
        item.AStringProperty,
        Is.EqualTo(updatedStringProperty));
    Assert.That(
        item.AnIntProperty,
        Is.EqualTo(updatedIntProperty));

这不是:

    Assert.That(
        item.Category,
        Is.Not.Null);
    Assert.That(
        item.Category.Name,
        Is.EqualTo(updatedCategory.Name));

最佳答案

您是否检查过之前的类别是否不为空?在下面的代码中,您仅在值不为空时更新该值,在两种情况下您可以获得类别的空值。 1. 如果该值当前为空,并且 2. 如果您的 categoryRepository.FetchById 返回空引用,则可能。

if (itemFromRepository.Category!= null)
{
     itemFromRepository.Category= this.categoryRepository.FetchById(itemFromRepository.Category.Id);
}

这两种情况都会导致您的断言失败。

关于c# - TryUpdateModel 仅在更新子对象的单元测试中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12012044/

相关文章:

asp.net-mvc - 字典mvc中的下拉列表

c# - 发布我的第一个应用程序 -> 权限被拒绝

javascript - "Add item"用于绑定(bind)到集合的表单的 JavaScript 按钮——MVC3 中的情况是否更好?

c# - 如何知道分数中的循环小数?

c# - 将 C# 字符串作为参数发送到非托管 C++ DLL 函数

c# - 了解 PagedList mvc 和 Entity Framework (慢查询)

c# - 将 MVC4 网站部署到 Windows Azure

jquery - Ajax 发布到 Controller 操作跨域

c# - Nhibernate QueryOver - 获取分页的子计数

c# - 使用 Exchange Web 服务发送 "Auto-Accepted"约会