2009-07-03 1 views
1

사람이 경우 xval에 대한 테스트를 생성하는 방법을 알고 있나요, 이상하여 포인트 DataAnnotations 여기 경우 xval 테스트

내가

[MetadataType (대해서 typeof (CategoryValidation을 테스트하고 싶은 몇 가지 동일한 코드 속성))] 공공 부분 클래스 카테고리 : CustomValidation { }

public class CategoryValidation 
{ 
    [Required] 
    public string CategoryId { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    [StringLength(4)] 
    public string CostCode { get; set; } 

} 

답변

2

음, 꽤 쉽게해야합니다 테스트. 나를 위해, 그것과 같이, NUnit과를 사용 : 이것은 당신이 DataAnnotations에 대한 검증 러너 ​​이미 구축하고 호출 할 수있는 방법이 가정

[Test] 
    [ExpectedException(typeof(RulesException))] 
    public void Cannot_Save_Large_Data_In_Color() 
    { 

     var scheme = ColorScheme.Create(); 
     scheme.Color1 = "1234567890ABCDEF"; 
     scheme.Validate(); 
     Assert.Fail("Should have thrown a DataValidationException."); 
    } 

. 당신이 여기 없어 할 정말 간단한 (내가 스티브 샌더슨의 블로그에서 흠) 내가 테스트에 사용할 하나 인 경우 :

public class ColorScheme 
{ 
    [Required] 
    [StringLength(6)] 
    public string Color1 {get; set; } 

    public void Validate() 
    { 
     var errors = DataAnnotationsValidationRunner.GetErrors(this); 
     if(errors.Any()) 
      throw new RulesException(errors); 
    } 
} 
: 내가 지금처럼 주자를 호출 위의 작은 샘플에서

internal static class DataAnnotationsValidationRunner 
{ 
    public static IEnumerable<ErrorInfo> GetErrors(object instance) 
    { 
     return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>() 
       from attribute in prop.Attributes.OfType<ValidationAttribute>() 
       where !attribute.IsValid(prop.GetValue(instance)) 
       select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance); 
    } 
} 

이것은 지나치게 단순하지만 작동합니다. MVC를 사용할 때 더 좋은 솔루션은 codeplex에서 얻을 수있는 Mvc.DataAnnotions 모델 바인더입니다. DefaultModelBinder에서 자신 만의 modelbinder를 쉽게 만들 수 있지만 이미 완료되었으므로 귀찮게 할 필요가 없습니다.

희망이 도움이됩니다.

추신. 또한 DataAnnotations로 작업하는 샘플 단위 테스트가있는 this site이 있습니다.