测试可序列化属性的设置

时间:2010-01-26 13:57:13

标签: c# .net unit-testing serialization attributes

我正在编写一个单元测试来验证我的类上是否设置了可序列化属性。我以为我是在正确的方式,但由于某种原因,我找不到属性类型。

这是我的班级:

[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 个答案:

答案 0 :(得分:1)

添加对System.Runtime.Serialization.dll的引用。

答案 1 :(得分:1)

您需要在单元测试项目中引用System.Runtime.Serialization程序集。

答案 2 :(得分:1)

我有一个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;