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

Posted

技术标签:

【中文标题】TryUpdateModel 仅在更新子对象的单元测试中失败【英文标题】:TryUpdateModel fails only in unit tests to update child objects 【发布时间】:2012-08-14 06:30:32 【问题描述】:

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

控制器:

[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】:

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

if (itemFromRepository.Category!= null)

     itemFromRepository.Category= this.categoryRepository.FetchById(itemFromRepository.Category.Id);

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

【讨论】:

以上是关于TryUpdateModel 仅在更新子对象的单元测试中失败的主要内容,如果未能解决你的问题,请参考以下文章

TryUpdateModel、ASP .NET MVC 3 的真实示例

React 子组件仅在刷新时更新

UITableViewCell 框架仅在滚动后更新

UITableView 仅在向上滚动时更新,而不是向下滚动

TableView 仅在屏幕旋转后更新

更新/插入子文档时的 mongodb 性能