我的第一篇博客,嘿嘿
在UnitTest中经常会用到Assert.AreEqual
但是AreEqual对引用类型来说是判断地址是否相等,而不是该对象的所有字段是否一一相等
于是我们需要判断值相等时,要么在UnitTest中对两个对象的所有字段一一比较,要么重写equals方法,对字段进行一一比较
无论是哪种方式,都要对每个字段比较一遍,比较麻烦
今天写着写着写烦了,就想找个省事点的方法,于是就有了本文的内容
一般来说我们要比较的对象,都是自己定义的Entity/Model,里面有大量的本身就是Serializable的Properties
就想到如果标记这个Entity为Serializable,用XmlSerializer序列化该对象,并比较序列化之后两个XmlDocument的InnerXml
这样就省去了先前的麻烦,日后如果增加/减少字段,也不用更改代码。
加上DEBUG标签,在测试阶段使用,也不会对实际环境造成性能和逻辑的影响
如果程序中有些地方需要用到ReferenceEquals
那么可以把那段代码当作Tools放在UnitTest工程里,而不是重写Equals
代码如下,不知道大家有没有其他的好办法。
在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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
XmlDocument leftXml = Serialize(this);
15
XmlDocument rightXml = Serialize(right);
16![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
return leftXml.InnerXml == rightXml.InnerXml;
18
}
19![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
return doc;
31
}
32
}
33![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
public override int GetHashCode()
35
{
36
return base.GetHashCode();
37
}
38
#endif
39
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)