2012-08-06 6 views
14

私はASP.NET MVC 3とDataAnnotationsを使ってプロジェクトに参加しています。 ViewModelsクラスにはDataAnnotationsがあります。あなたはこれらの検証のためのユニットテストを書くにはどうすればよいTDD:ASP.NET MVC 3でDataAnnotationsをテストするベストプラクティスは何ですか?

のViewModel例:

public class AchievementVM 
{ 
    [Required(ErrorMessage = "The title field is required.")] 
    [StringLength(100, ErrorMessage = "Title must be 100 characters or less.")] 
    public string Title { get; set; } 
} 

ありがとう!

+1

このデータの注釈は何ですか?それは妥当性検査なのでしょうか? –

+0

これは、検証されるべきコンポーネントのマークです。データアノテーションを使用した手動検証の実例:http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx –

答えて

1

はこちらをご覧ください:Unit Testing ASP.NET DataAnnotations validation

また、あなたはクラスのプロパティは、任意の必要な属性を持っているかいないかどうかを確認するためにリフレクションを使用することができます。

3

これらの注釈は非常に宣言されているので、ちょうど方法がアノテートされていること(反射して)チェックユニットテスト書き込みはほとんど意味がある - テストは単に生産コードを複製することになるが。そして、それは、フレームワークがそれらが使用されることを期待する方法でアノテーションが使用されていない可能性が残っています(間違ったアノテーション、間違った場所、または追加の設定が欠落している可能性があります)。

このように意味のあるテストでは、ユニットテストが、システムが正常に注釈を検出していることを確認する統合テストではないでしょう。速度を妥当なものに保つためには、可能な限りフレームワークをインスタンス化することによって、フレームワークの深い知識(RTFS)が必要な統合テストを可能な限り集中させてください。それ以外の場合、エンドツーエンドのテストでは、HTMLを解析し、無効なデータがフィールドに入力されたときに検証エラーが表示されることを確認して、注釈の正しい使用をチェックできます。

検証が有効になっていることを確認するために、統合/エンド・ツー・エンドのテストだけのカップルを書くことが必要でなければなりません。それらがすべて同じように動作するとき、それぞれのフィールドをテストする必要はありません。

15

.NETフレームワークは、単独であなたの検証ロジックを行使することができますValidatorクラスが付属しています。テストするコードは次のようになります。

var achievement = new AchievementVM(); 
var context = new ValidationContext(achievement, 
    serviceProvider: null, items: null); 
var results = new List<ValidationResult>(); 

var isValid = Validator.TryValidateObject(achievement, context, results, true); 

Assert.IsTrue(results.Any(vr => vr.ErrorMessage == "The title field is required.")); 

achievement.Title = "Really really long title that violates " 
    + "the range constraint and should not be accepted as " 
    + "valid input if this has been done correctly."; 

Validator.TryValidateObject(achievement, context, results, true); 

Assert.IsTrue(results.Any(vr => vr.ErrorMessage == "Title must be 100 characters or less.")); 

属性の存在を検索するカスタムユーティリティは必要ありません。 Validatorクラスは、あなたのために作業を行い、MVCインフラストラクチャと同じようにValidationResultコレクションに値を設定します。この方法で

良い過去記事はK. Scott Allen's blogで見つけることができます。

+0

偉大な答え。これは単体テストに最適な方法です。私は検証が何を検証しているのかを手作業で指定することなく検証できます。 –

+1

'TryValidationObject()'で再度使用する前に、 'results.Clear()'コレクションにお勧めします。 –

関連する問題