Como você testaria as anotações de dados da unidade?
Duas das propriedades da classe possuem as seguintes anotações:
[Key]
[Column]
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[MaxLength(25)]
public string Name { get; set; }
Eu entendo que testar os atributos Key, Column e Required não é mais um teste de unidade, é um teste de integração, pois depende do banco de dados subjacente, mas como você testa o atributo MaxLength (25)?
Uma das alternativas que posso pensar é adicionar um contrato de código na propriedade.
Atualizar
Como sugerido, escrevi o seguinte ajudante:
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;
}
}
Eu testei meu ajudante:
[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);
}
Tudo funciona bem, além do fato de que métodos e propriedades devem ser públicos para que eu use a reflexão. Não consigo pensar em nenhum caso em que precisei adicionar atributos às propriedades / métodos particulares.
E então testando as anotações da EF:
public void IdProperty_Has_KeyAttribute()
{
// Arrange
var helper = new AttributeHelper<Player>();
// Act
var result = helper.PropertyHasAttribute(typeof (KeyAttribute), "Id");
// Assert
Assert.IsTrue(result);
}