2009-07-03 5 views
1

Est-ce que quelqu'un sait comment générer un test pour la xVal, ou plus les point où l'DataAnnotations attribuetest xVal

Voici quelques même code que je voudrais tester

[MetadataType (typeof (CategoryValidation))] public partial class Catégorie: CustomValidation {}

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

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

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

} 

Répondre

2

Eh bien, les tests, il devrait être assez facile. Pour moi, en utilisant NUnit, son comme celui-ci:

[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."); 
    } 

Cela suppose que vous avez un coureur de validation pour DataAnnotations déjà construit et une façon de l'appeler. Si vous n'êtes pas ici est un vraiment simpliste, je l'utilise pour les tests (que j'entaillé du blog de Steve Sanderson):

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

Dans le petit exemple ci-dessus que j'appelle le coureur comme ceci:

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

Tout cela est trop simpliste mais ça marche. Une meilleure solution lors de l'utilisation de MVC est le classeur modèle Mvc.DataAnnotions que vous pouvez obtenir à partir de codeplex. C'est assez facile de construire votre propre modelbinder à partir de DefaultModelBinder, mais pas besoin de déranger puisque c'est déjà fait.

Espérons que cela aide.

PS. Également trouvé this site qui a quelques exemples de tests unitaires travaillant avec DataAnnotations.