2011-01-12 2 views
26

У меня есть собственный атрибут проверки атрибута asv.net mvc. Мой вопрос: как я могу его проверить? Было бы проверено, что класс имеет атрибут, но на самом деле это не проверяет логику внутри него. Это то, что я хочу проверить.Как я могу проверить свой собственный атрибут проверки

[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; } 

..... удален для краткости }

[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; 

    } 
} 

Я попытался написать тест следующим образом, но это не работает:

[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(). Если он работает нормально, доверьтесь Framework, что атрибут работает нормально.

Итак:

[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

you может захотеть добавить флаг true для проверки всех свойств - «Validator.TryValidateObject (модель, контекст, результаты, истина);» - У меня были проблемы при тестировании моей проверки с помощью NUnit, проверка внутри «защищенного переопределения ValidationResult IsValid (..)» не попала, если только я не предоставил «validateAllProperties» как истинный - следовательно, тесты не выполнялись, как ожидалось, и я не мог отлаживать мой код. – JimiSweden

Смежные вопросы