2

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

コントローラ:

[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));
4

1 に答える 1

0

前のカテゴリが null でないことを確認しましたか? 次のコードでは、null でない場合にのみ値を更新します。2 つのケースでカテゴリの null 値を取得できます。1. 値が現在 null の場合、および 2. おそらく、categoryRepository.FetchById が null 参照を返す場合。

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

これらの状況は両方とも、アサートが失敗する原因になります。

于 2012-10-08T08:48:44.290 に答える