2011-01-12 10 views
26

私はカスタムasp.net mvcクラス検証属性を持っています。 私の質問は、どのようにユニットテストできるのですか? クラスに属性があることをテストするのは一つのことですが、実際にその内部のロジックをテストすることはありません。これは私がテストしたいものです。私は次のようにテストを書くことを試みたが、これは動作しませんユニットのカスタム検証属性をユニットテストするには

[AttributeUsage(AttributeTargets.Class)] 
public class EligabilityStudentDebtsAttribute : ValidationAttribute 
{ 
    // If AnyDebts is true then 
    // StudentDebts must be true or false 

    public override bool IsValid(object value) 
    { 
     Eligability elig = (Eligability)value; 
     bool ok = true; 
     if (elig.AnyDebts == true) 
     { 
      if (elig.StudentDebts == null) 
      { 
       ok = false; 
      } 
     } 
     return ok; 

    } 
} 

簡潔 }のために取り外さ

[Serializable] 
[EligabilityStudentDebtsAttribute(ErrorMessage = "You must answer yes or no to all questions")] 
public class Eligability 
{ 
    [BooleanRequiredToBeTrue(ErrorMessage = "You must agree to the statements listed")] 
    public bool StatementAgree { get; set; } 

    [Required(ErrorMessage = "Please choose an option")] 
    public bool? Income { get; set; } 

.....:

[TestMethod] 
public void Eligability_model_StudentDebts_is_required_if_AnyDebts_is_true() 
{ 

    // Arrange 
    var eligability = new Eligability(); 
    var controller = new ApplicationController(); 

    // Act 
    controller.ModelState.Clear(); 
    controller.ValidateModel(eligability); 
    var actionResult = controller.Section2(eligability,null,string.Empty); 

    // Assert 
    Assert.IsInstanceOfType(actionResult, typeof(ViewResult)); 
    Assert.AreEqual(string.Empty, ((ViewResult)actionResult).ViewName); 
    Assert.AreEqual(eligability, ((ViewResult)actionResult).ViewData.Model); 
    Assert.IsFalse(((ViewResult)actionResult).ViewData.ModelState.IsValid); 
} 

ModelStateDictionaryはしていませんこのカスタム属性のキーが含まれています。 標準検証属性の属性のみが含まれています。

これはなぜですか?

これらのカスタム属性をテストする最良の方法は何ですか?

答えて

35

あなたの属性EligabilityStudentDebtsAttributeは他のすべてのものと同じように標準クラスに過ぎず、単体テストのIsValid()メソッドをテストします。それが正常に動作する場合、その属性が正常に動作するフレームワークを信頼してください。

ので:あなたのカスタム検証属性は、他のプロパティの状態に依存する可能性がある

[Test] 
public void AttibuteTest() 
{ 
    // arrange 
    var value = //.. value to test - new Eligability() ; 
    var attrib = new EligabilityStudentDebtsAttribute(); 

    // act 
    var result = attrib.IsValid(value); 

    // assert 
    Assert.That(result, Is.True) 
} 
+0

Doh!もちろん! – MightyAtom

+1

これはクロスプロパティ検証を実行する最善の方法ですか? (複数のプロパティを含むモデル検証) – MightyAtom

+0

単純なままにしてください。もしあなたがうまくいくなら、より多くのcompexテストを行う理由はありません:) –

6

。この場合、System.ComponentModel.DataAnnotations.Validatorの静的メソッドを使用できます。たとえば、

var model = ... 
var context = new ValidationContext(model); 
var results = new List<ValidationResult>(); 
var isValid = Validator.TryValidateObject(model, context, results, true); 
Assert.True(isValid); 
+1

すべてのプロパティを検証するためにtrueフラグを追加することができます。 - "Validator.TryValidateObject(model、context、results、true);" - "validateAllProperties"をtrueに指定しない限り、NUnitで検証をテストするときに問題が発生しました。これは、 "protected override ValidationResult IsValid(..)"内の検証は当てはまりませんでした。したがって、テストは期待どおりに実行されず、私のコードにデバッグしてください。 – JimiSweden

関連する問題