【发布时间】:2012-04-21 14:29:01
【问题描述】:
两个类属性有以下注解:
[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);
}
【问题讨论】:
-
我认为通过测试属性是否完成了它们的工作,而不是测试底层业务逻辑,您正在测试属性框架,这不是您应该测试的(微软已经完成了)。您只需要在业务层中确保如果您传递一个 26 个字符长的字符串,该方法会返回某种违规,因为 25 是最大长度。您针对传递 26 个字符的字符串的业务层编写单元测试。如果你想测试你的 UI 层不允许输入超过 25 个字符,请使用 Selenium 或类似的。
标签: c# unit-testing tdd data-annotations