Проверка того, что сериализуемые атрибуты установлены - PullRequest
0 голосов
/ 26 января 2010

Я пишу модульный тест, чтобы убедиться, что сериализуемые атрибуты установлены в моем классе. Я думал, что был на правильном пути, но по какой-то причине я не могу найти типы атрибутов.

Вот мой класс:

[DataContract]
public class User
{
    [DataMember]
    public int Id { get; set; }
}

И модульный тест для проверки атрибутов:

[Test]
public void DataMembersSetAsExpected()
{
    var type = typeof(User);
    Assert.That(type.IsDefined(typeof(System.Runtime.Serialization.DataContractAttribute), true));
    var idProperty = type.GetProperty("Id");
    Assert.That(idProperty.IsDefined(typeof(System.Runtime.Serialization.DataMemberAttribute), true));
}

Проблема здесь в том, что типы атрибутов неизвестны. Где я могу найти правильные определения атрибутов?

System.Runtime.Serialization.DataContractAttribute
System.Runtime.Serialization.DataMemberAttribute

Ответы [ 3 ]

1 голос
/ 26 января 2010

Вам необходимо сослаться на сборку System.Runtime.Serialization в вашем проекте модульного тестирования.

1 голос
/ 26 января 2010

У меня есть класс 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;
1 голос
/ 26 января 2010

Добавить ссылку на System.Runtime.Serialization.dll.

...