Как бы вы тестировали аннотации данных?
Два свойства класса имеют следующие аннотации:
[Key]
[Column]
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[MaxLength(25)]
public string Name { get; set; }
Я понимаю, что тестирование атрибутов Key, Column и Required больше не является модульным тестом, это интеграционный тест, поскольку он будет зависеть от базовой базы данных, но как вы будете тестировать атрибут MaxLength(25)?
Одна из альтернатив, о которых я могу подумать, это добавить контрактный код в свойство.
Обновить
Как и предполагалось, я написал следующий помощник:
public class AttributeHelper <T> where T : class
{
private Type GivenClass
{
get { return typeof (T); }
}
public bool HasAnnotation(Type annotation)
{
return GivenClass.GetCustomAttributes(annotation, true).Single() != null;
}
public bool MethodHasAttribute(Type attribute, string target)
{
return GivenClass.GetMethod(target).GetCustomAttributes(attribute, true).Count() == 1;
}
public bool PropertyHasAttribute(Type attribute, string target)
{
return GivenClass.GetProperty(target).GetCustomAttributes(attribute, true).Count() == 1;
}
}
Затем я проверил мой помощник:
[TestMethod]
public void ThisMethod_Has_TestMethod_Attribute()
{
// Arrange
var helper = new AttributeHelper<AttributeHelperTests>();
// Act
var result = helper.MethodHasAttribute(typeof (TestMethodAttribute), "ThisMethod_Has_TestMethod_Attribute");
// Assert
Assert.IsTrue(result);
}
Все работает отлично, за исключением того, что методы и свойства должны быть публичными, чтобы я мог использовать рефлексию. Я не могу вспомнить ни одного случая, когда мне приходилось добавлять атрибуты в частные свойства / методы.
А затем тестирование аннотаций EF:
public void IdProperty_Has_KeyAttribute()
{
// Arrange
var helper = new AttributeHelper<Player>();
// Act
var result = helper.PropertyHasAttribute(typeof (KeyAttribute), "Id");
// Assert
Assert.IsTrue(result);
}
1 ответ
Я понимаю, что тестирование атрибутов Key, Column и Required больше не является модульным тестом, это интеграционный тест, поскольку он будет зависеть от базовой базы данных.
Как это так? Вы можете проверить, Id
свойство помечено со всеми этими атрибутами просто отлично. И это попадает в категорию юнит-тестов.
[Test]
public void Id_IsMarkedWithKeyAttribute()
{
var propertyInfo = typeof(MyClass).GetProperty("Id");
var attribute = propertyInfo.GetCustomAttributes(typeof(KeyAttribute), true)
.Cast<KeyAttribute>()
.FirstOrDefault();
Assert.That(attribute, Is.Not.Null);
}
Таким образом, вы можете убедиться, что ваши свойства помечены любым атрибутом, который вы можете придумать. Конечно, это включает некоторую работу по отражению, но именно так вы тестируете маркировку атрибутов.