gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:27:46 25 4
gpt4 key购买 nike

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

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/

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