1

私はテストにかなり慣れておらず、コントローラーテストを次のように書いています。

var result = myController.Create(It.IsAny<int>());

Assert.IsInstanceOfType(result, typeof(ViewResult));
Assert.AreEqual(string.Empty, ((ViewResult)result).ViewName, "Default view expected.");
Assert.IsInstanceOfType(((ViewResult)result).ViewData.Model, typeof(FooBarCreateEditViewModel));

これは正常に機能しますが、テスト2と3のキャストを実行する必要があるという点で、読みやすくありません。別のアプローチとして、次のことを行うことができます。

var result = (ViewResult)myController.Create(It.IsAny<int>());

Assert.AreEqual(string.Empty, result.ViewName, "Default view expected.");
Assert.IsInstanceOfType(result.ViewData.Model, typeof(FooBarCreateEditViewModel));

これもうまくいくようで、私の意見ではもっと読みやすくなっています。それに関する私の問題は、ジョブを実行するためのアサーションを明示的に定義するのではなく、IsInstanceOfTypeテストを実行するためにテストの「act」部分に依存していることです。

それで、私の2番目のアプローチは続行しても大丈夫ですか?メソッドが別のタイプを返す場合、キャストに依存してエラーをスローする際に問題が発生する可能性がありますか?

4

1 に答える 1

1

MVCContrib.TestHelperを使用できます。次のような非常に読みやすい単体テストを作成できます。

// arrange
...

// act
var actual = controller.Create(123);

// assert
actual
    .AssertViewRendered()
    .WithViewData<FooBarCreateEditViewModel>();

私が書いた次のサンプルユニットテストをチェックしてください。

于 2012-08-14T09:21:37.970 に答える