J'ai été en passant par http://bradwilson.typepad.com/blog/2009/04/dataannotations-and-aspnet-mvc.htmldans ce post, je n'aimais pas l'idée de mettre les tests de validation dans le contrôleur de test et un peu de contrôle manuel dans chaque test si la validation de l'attribut existe ou pas. Alors, ci-dessous est la méthode d'assistance et c'est l'utilisation qui j'ai mis en place, il fonctionne pour EDM (qui a les attributs de métadonnées, en raison de la raison pour laquelle nous ne pouvons pas appliquer les attributs générés automatiquement, EDM classes) et des objets POCO qui ont ValidationAttributes appliquées à leurs propriétés.
La méthode d'assistance de ne pas analyser hiérarchique des objets, mais la validation peut être testé sur le plat des objets individuels(au niveau du Type)
class TestsHelper
{
internal static void ValidateObject<T>(T obj)
{
var type = typeof(T);
var meta = type.GetCustomAttributes(false).OfType<MetadataTypeAttribute>().FirstOrDefault();
if (meta != null)
{
type = meta.MetadataClassType;
}
var propertyInfo = type.GetProperties();
foreach (var info in propertyInfo)
{
var attributes = info.GetCustomAttributes(false).OfType<ValidationAttribute>();
foreach (var attribute in attributes)
{
var objPropInfo = obj.GetType().GetProperty(info.Name);
attribute.Validate(objPropInfo.GetValue(obj, null), info.Name);
}
}
}
}
/// <summary>
/// Link EDM class with meta data class
/// </summary>
[MetadataType(typeof(ServiceMetadata))]
public partial class Service
{
}
/// <summary>
/// Meta data class to hold validation attributes for each property
/// </summary>
public class ServiceMetadata
{
/// <summary>
/// Name
/// </summary>
[Required]
[StringLength(1000)]
public object Name { get; set; }
/// <summary>
/// Description
/// </summary>
[Required]
[StringLength(2000)]
public object Description { get; set; }
}
[TestFixture]
public class ServiceModelTests
{
[Test]
[ExpectedException(typeof(ValidationException), ExpectedMessage = "The Name field is required.")]
public void Name_Not_Present()
{
var serv = new Service{Name ="", Description="Test"};
TestsHelper.ValidateObject(serv);
}
[Test]
[ExpectedException(typeof(ValidationException), ExpectedMessage = "The Description field is required.")]
public void Description_Not_Present()
{
var serv = new Service { Name = "Test", Description = string.Empty};
TestsHelper.ValidateObject(serv);
}
}
c'est un autre post http://johan.driessen.se/archive/2009/11/18/testing-dataannotation-based-validation-in-asp.net-mvc.aspx qui parle de validation en .Net 4, mais je pense que je vais en tenir à ma méthode d'assistance qui est valable dans les deux 3,5 et 4