5

初め; MVC の内部をテストする必要がないことはわかっていますが、システムに流れ込むデータに関する一連のテストが本当に必要です。

HTTP コンテキストのすべてをモックすることなく、objectA (フォーム コレクション、辞書、コレクション、オブジェクトなど) が objectAModel に準拠しているかどうかをテストするにはどうすればよいでしょうか?

コントローラーをインスタンス化したり、アクションを呼び出したりする必要はありません。新しいオブジェクトがモデル状態を無効にするかどうかをテストしたいだけです。

簡単に書けばいいのに

var modelState = new ModelBindingContext<objectAModel>().validate(objectA);
4

2 に答える 2

2

Brad Wilson のDataAnnotations に関する優れた投稿があります。


どのようにテストするのですか?

モデルに DataAnnotations 属性を使用すると、検証がコントローラー アクションからモデル バインダーに移動します。つまり、コントローラー アクションの単体テストが簡素化されます。

このためのテストを作成するときは、次の 3 つのことを確認する必要があります。

  1. DataAnnotationsModelBinder は既定のバインダーとして登録されていますか? これは、作成するルート テストと同じように、アプリケーション全体に対して 1 回だけ行います。
  2. モデルは DataAnnotations 属性で適切に装飾されていますか? モデルに追加する検証属性ごとにテストを作成することになります。
  3. モデルの状態が無効な場合、アクション メソッドは適切に反応しますか? これは、アクション メソッドごとに 1 回だけ記述する必要があります。
于 2009-11-25T04:24:09.563 に答える
0

非常に簡単に言えば、ModelMetadataモデルの型の をプルし、 を取得しModelValidator、モデル オブジェクトを検証するメソッドを実装できます。

public bool IsModelValid<T>(T model) where T : class
{
    var metaData = ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(T));
    var validator = ModelValidator.GetModelValidator(metaData, new ControllerContext());
    var validationResults = validator.Validate(model);
    return 0 == validationResults.Count();
}

「単純に」とは、これが必ずしもすべての可能な構成を考慮に入れるわけではないことを意味しますが、モデルの妥当性に関する基本的なチェックを得ることができます。

于 2015-02-16T21:18:12.657 に答える