我正在编写一个单元测试来验证我的类上是否设置了可序列化属性。我以为我是在正确的方式,但由于某种原因,我找不到属性类型。
这是我的班级:
[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
答案 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;