1. ホーム
  2. asp.net

[解決済み] ASP.NET DataAnnotationsのユニットテスト検証

2023-07-24 05:40:56

質問

モデルの検証にDataAnnotationsを使用しています。

[Required(ErrorMessage="Please enter a name")]
public string Name { get; set; }

コントローラでは、ModelStateの値をチェックしています。これは、ビューから投稿された無効なモデルデータに対して正しくfalseを返しています。

しかし、私のコントローラのアクションのユニットテストを実行すると、ModelStateは常にtrueを返します。

[TestMethod]
public void Submitting_Empty_Shipping_Details_Displays_Default_View_With_Error()
{
    // Arrange
    CartController controller = new CartController(null, null);
    Cart cart = new Cart();
    cart.AddItem(new Product(), 1);

    // Act
    var result = controller.CheckOut(cart, new ShippingDetails() { Name = "" });

    // Assert
    Assert.IsTrue(string.IsNullOrEmpty(result.ViewName));
    Assert.IsFalse(result.ViewData.ModelState.IsValid);
}

テストでモデルの検証を設定するために、何か特別なことをする必要がありますか?

ありがとうございます。

ベン

どのように解決するのですか?

バリデーションは ModelBinder . この例では ShippingDetails をスキップして ModelBinder を省略することができ、その結果、検証も完全に省略されます。入力検証とモデル検証の違いに注意してください。入力バリデーションは、ユーザーが何らかのデータを提供する機会があったことを確認するためのものです。関連するフィールドがないフォームを提供する場合、関連するバリデーターは呼び出されません。

MVC2では、モデル検証と入力検証について変更があったので、正確な動作は使用しているバージョンに依存します。以下を参照してください。 http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html を参照してください。

[EDIT] これに対する最もクリーンなソリューションは UpdateModel を手動で呼び出すことです。 ValueProvider . これでバリデーションが実行され ModelState を正しく設定します。