У меня есть класс Fixture
, который я использую для модульного тестирования (генератор тестовых данных), и я создал для него следующие методы расширения:
public static void SutPropertyHasAttribute<TSut, TProperty>(this Fixture fixture, Expression<Func<TSut, TProperty>> propertyExpression, Type attributeType)
{
var pi = (PropertyInfo)((MemberExpression)propertyExpression.Body).Member;
var count = pi.GetCustomAttributes(attributeType, true).Count();
Assert.AreEqual(1, count);
}
public static void SutHasAttribute<TSut>(this Fixture fixture, Type attributeType)
{
var type = typeof(TSut);
var count = type.GetCustomAttributes(attributeType, true).Count();
Assert.AreEqual(1, count);
}
public static void SutMethodHasAttribute<TSut>(this Fixture fixture, Expression<Action<TSut>> methodExpression, Type attributeType)
{
var mi = (MethodInfo)((MethodCallExpression)methodExpression.Body).Method;
var count = mi.GetCustomAttributes(attributeType, true).Count();
Assert.AreEqual(1, count);
}
Теперь я называю это так из моих тестов:
[TestMethod]
public void SutHasDataContractAttribute()
{
// Fixture setup
// Exercise system and verify outcome
new Fixture().SutHasAttribute<Flag>(typeof(DataContractAttribute));
// Teardown
}
[TestMethod]
public void FlagGroupIdHasDataMemberAttribute()
{
// Fixture setup
// Exercise system and verify outcome
new Fixture().SutPropertyHasAttribute((Flag f) => f.FlagGroupId, typeof(DataMemberAttribute));
// Teardown
}
Класс Flag
выглядит следующим образом:
[DataContract(Namespace ="http://mynamespace")]
public class Flag
{
[DataMember]
public string FlagGroupId { get; set; }
}
Конечно, вам нужна ссылка на System.Runtime.Serialization
, например:
using System.Runtime.Serialization;