private void Deserialize()
{
var serialzer = new XmlSerializer(typeof(OnlineFriends));
using (XmlReader xmlreader = XmlReader.Create("OnlineFriends.xml"))
{
fs = serialzer.Deserialize(xmlreader) as OnlineFriends;
fs.IsEmpty = false;
}
}
public class OnlineFriendData
{
[XmlElement("FriendId")]
public int FriendId { get; set; }
[XmlElement("Province")]
public string Province { get; set; }
[XmlElement("City")]
public string City { get; set; }
[XmlElement("Age")]
public int Age { get; set; }
[XmlElement("Gender")]
public byte Gender { get; set; }
[XmlElement("HasPhoto")]
public bool HasPhoto { get; set; }
}
[XmlArray("Friends")]
[XmlArrayItem("OnlineFriendData")]
public OnlineFriendData[] Friends { get; set; }
}
数据的准备工作就差不多了,看一个简单的测试。首先这个测试方法会重新初始化测试数据,然后查询27岁的在线会员,查询出来的结果保存在 ids的 INT列表中。OnlineFriends.Instance.Friends对象中保存了所有在线好友的数据,它是一个实现了IEnumerable接口的类,所以可以使用LINQ相关的扩展方法。
在OnlineFriends.Instance.Friends.Where(x => x.Age == age)语句中,“x => x.Age == age”是一个应用了Lambda表达式的匿名委托,整个语句的意思就是在OnlineFriends.Instance.Friends这个集合中,找到年龄==age的元素。
不过找到了以后还不行啊,SUT返回的是INT列表,而刚才查到的是OnlineFriendData对象的集合,接下来可以用Select(y => y.FriendId).ToList()对集合做一个投影,只取出FriendId属性,并且转换为INT列表。
最后用CollectionAssert.AreEquivalent()方法对两个INT列表进行比较,看列表是否相等。
[TestMethod]
public void GetOnlineFriendsIdList_Query_Age_LowerUpperDiffOne()
{
//重新初始化测试数据
TestHelp.InitForSearch();
int age = 27;
OnlineFriendQuery query = new OnlineFriendQuery();
query.AgeLowerBound = age;
query.AgeUpperBound = age;
//根据条件查询在线会员,在这里就是要查询27岁的会员
List<int> ids = FriendListGateway.FriendListProvider.GetOnlineFriendsIdList(query, MyAllPc);
//Two collects are equivalent
CollectionAssert.AreEquivalent(OnlineFriends.Instance.Friends.Where(x => x.Age == age).Select(y => y.FriendId).ToList</int><int>(), ids);
}
</int>
假如使用我最开始的测试方法(就是先准备测试数据,然后人工统计一下里面有多少个27岁的数据,最后进行比较),我在完成了这一条测试以后,接下来还要小心翼翼地添加测试数据,不能再添加年龄是27岁的数据,要不然就会影响到测试结果。但是应用了LINQ以后,我在后续的测试数据设计中就无需要担心新设计的测试数据会对老的测试造成影响。甚至我还可以用程序生成各种不同的数据,填入数据库,供我测试用。
责任编辑:小草