次のコードをサーバー上で動作させることはできますが、単体テストでは動作しません。単体テストでは、単純なプロパティは正しく設定されていますが、子オブジェクトは正しく設定されていません。私はあまりにも長い間壁に頭をぶつけてきたので、アドバイスを歓迎します.
コントローラ:
[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));