Я проходил через http://bradwilson.typepad.com/blog/2009/04/dataannotations-and-aspnet-mvc.html, в этом посте. Мне не нравилась идея помещать проверочные тесты в тест контроллера и несколько ручной проверки в каждом тесте, если атрибут проверки существует или нет. Итак, ниже приведен вспомогательный метод, и его использование, которое я реализовал, работает как для EDM (у которого есть атрибуты метаданных, по той причине, что мы не можем применять атрибуты к автоматически генерируемым классам EDM), так и для объектов POCO, для которых ValidationAttributes применены к их свойствам .
Вспомогательный метод не разбирается на иерархические объекты, но проверка может быть проверена на плоских отдельных объектах (уровень типа)
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);
}
}
это еще один пост http://johan.driessen.se/archive/2009/11/18/testing-dataannotation-based-validation-in-asp.net-mvc.aspx, в котором говорится о проверке в .Net 4, но я думаю, что я собираюсь придерживаться своего вспомогательного метода, который действителен как в 3,5, так и в 4