2013-09-12 3 views
4

Я пытаюсь создать единичный тест для проверки объекта Entity Framework. Я нашел эту ссылку: https://stackoverflow.com/a/11514648/2486661, но проверка для меня никогда не получает значение false. Я использую аннотации данных в свойствах объекта сущности. Для этого я создаю объект MetaData для включения аннотаций и аннотированный объект сущности, как это:Тестирование модулей для сущности Framework Validation

[MetadataType(typeof(MyEntityObjectMetaData))] 
public partial class MyEntityObject 
{ 
} 

Мои проверки аннотации, как это:

public class MyEntityObjectMetaData 
{ 
    [StringLength(8, ErrorMessage = "Invalid Length for myProperty.")] 
    public String myProperty { get; set; } 
} 

И код для модульного тестирования:

[TestMethod] 
    public void TestMethod1() 
    { 
     MyEntityObject myEntityObject = new MyEntityObject(); 

     myEntityObject.myProperty = "1234567890"; 

     var context = new ValidationContext(myEntityObject, null, null); 
     var results = new List<ValidationResult>(); 

     var actual = Validator.TryValidateObject(myEntityObject, context, results); 
     var expected = false; 

     Assert.AreEqual(expected, actual); 
    } 

Я не понимаю, почему проверка объекта возвращает значение true, если у меня есть недопустимое значение для свойства. Спасибо за любую помощь.

ответ

2

я решить эту проблему с помощью объекта DbContext так:

MyEntityObject myEntityObject = new MyEntityObject(); 
myEntityObject.myProperty = "1234567890"; 

var dbContext = new DbContext(MyEntityObject, true); 

int errors = dbContext.GetValidationErrors().Count(); 

IEnumerable<DbEntityValidationResult> validationResults = 
             dbContext.GetValidationErrors(); 
DbValidationError validationError = validationResults.First().ValidationErrors.First(); 

Assert.AreEqual(1, errors); 
Assert.AreEqual("myProperty", validationError.PropertyName); 

MyEntityObject является подклассом класса ObjectContext и автоматически генерируется Entity Framework. Я до сих пор не понимаю, почему использование метода Validator.TryValidateObject не работает.

3

Ниже приведен пример кода как часть серии тестов, которые я запускаю для каждой модели просмотра, включая тест, чтобы убедиться, что ожидаемые имена свойств есть.

/// <summary> 
/// Check expected properties exist. 
/// </summary> 
[Test] 
public void Check_Expected_Properties_Exist() 
{ 

// Get properties. 
PropertyInfo propInfoFirstName = typeof(ViewModels.MyModel).GetProperty("FirstName"); 
PropertyInfo propInfoLastName = typeof(ViewModels.MyModel).GetProperty("LastName"); 

// Assert. 
Assert.IsNotNull(propInfoFirstName); 
Assert.IsNotNull(propInfoLastName); 

} 

Надеюсь, это поможет.

1

Вы должны сообщить валидатору, что бы подтвердить все свойства. Dbcontext будет отслеживать изменения в сущности и передавать определенные свойства проверяющему.

В EF 6 вы бы назвали

var actual = Validator.TryValidateObject(myEntityObject, context, results, validateAllProperties: true); 
Смежные вопросы