我的第一篇博客,嘿嘿

在UnitTest中经常会用到Assert.AreEqual
但是AreEqual对引用类型来说是判断地址是否相等,而不是该对象的所有字段是否一一相等
于是我们需要判断值相等时,要么在UnitTest中对两个对象的所有字段一一比较,要么重写equals方法,对字段进行一一比较
无论是哪种方式,都要对每个字段比较一遍,比较麻烦
今天写着写着写烦了,就想找个省事点的方法,于是就有了本文的内容

一般来说我们要比较的对象,都是自己定义的Entity/Model,里面有大量的本身就是Serializable的Properties
就想到如果标记这个Entity为Serializable,用XmlSerializer序列化该对象,并比较序列化之后两个XmlDocument的InnerXml
这样就省去了先前的麻烦,日后如果增加/减少字段,也不用更改代码。
加上DEBUG标签,在测试阶段使用,也不会对实际环境造成性能和逻辑的影响

如果程序中有些地方需要用到ReferenceEquals
那么可以把那段代码当作Tools放在UnitTest工程里,而不是重写Equals  

代码如下,不知道大家有没有其他的好办法。

 1    [Serializable]
 2    public abstract class EntityBase
 3    {
 4#if DEBUG
 5        public override bool Equals(object right)
 6        {
 7            if (right == null)
 8                return false;
 9            if (object.ReferenceEquals(this, right))
10                return true;
11            if (this.GetType() != right.GetType())
12                return false;
13
14            XmlDocument leftXml = Serialize(this);
15            XmlDocument rightXml = Serialize(right);
16
17            return leftXml.InnerXml == rightXml.InnerXml;
18        }

19
20        private XmlDocument Serialize(object obj)
21        {
22            using (MemoryStream stream = new MemoryStream())
23            {
24                XmlDocument doc = new XmlDocument();
25                XmlSerializer serializer = new XmlSerializer(obj.GetType());
26                serializer.Serialize(stream, obj);
27                stream.Seek(0, SeekOrigin.Begin);
28                doc.Load(stream);
29
30                return doc;
31            }

32        }

33
34        public override int GetHashCode()
35        {
36            return base.GetHashCode();
37        }

38#endif
39    }
posted on 2007-08-10 11:28  Mirricle  阅读(2137)  评论(6编辑  收藏  举报