繁体   English   中英

(深层)单元测试中对象与引用的比较(C#)

[英](Deep) comparison of an object to a reference in unit tests (C#)

在单元测试中(在Visual Studio 2008中)我想比较一个大对象(确切地说是自定义类型列表)的内容与该对象的存储引用。 目标是确保代码的任何后续重构都产生相同的对象内容。

丢弃的想法:首先想到的是序列化为XML,然后比较硬编码的字符串或文件内容。 这样可以轻松找到任何差异。 但是,由于我的类型不是没有黑客的XML序列化,我必须找到另一个解决方案。 我可以使用二进制序列化,但这将不再可读。

有一个简单而优雅的解决方案吗?

编辑:根据Marc Gravell的建议,我现在喜欢这样:

using (MemoryStream stream = new MemoryStream())
        {
            //create actual graph using only comparable properties
            List<NavigationResult> comparableActual = (from item in sparsed
                                                       select new NavigationResult
                                                       {
                                                           Direction = item.Direction,
                                                           /*...*/
                                                           VersionIndication = item.VersionIndication
                                                       }).ToList();

            (new BinaryFormatter()).Serialize(stream, comparableActual);
            string base64encodedActual = System.Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length);//base64 encoded binary representation of this                
            string base64encodedReference = @"AAEAAAD....";//this reference is the expected value
            Assert.AreEqual(base64encodedReference, base64encodedActual, "The comparable part of the sparsed set is not equal to the reference.");
        }

本质上,我首先选择可比较的属性,然后对图形进行编码,然后将其与类似编码的参考进行比较。 编码可以通过简单的方式进行深入比较。 我使用base64编码的原因是,我可以轻松地将引用存储在字符串变量中。

我仍然倾向于使用序列化。 但不是必须知道二进制文件,只需创建一个预期的图形,序列化它。 现在序列化实际图形并比较字节。 这是唯一有用的告诉你, 有区别的; 你需要检查才能找到什么 ,这是一种痛苦。

我会用hack做XML比较。 或者您可以使用反射来自动遍历对象属性(但这将遍历所有这些,也可能是您不想要的)。

我会让每个自定义类型继承IComparable,并提供相等的方法,比较每个自定义类型,以及使主类ICompareble,然后你可以简单地比较2个对象(如果你在运行单元测试时在内存中有它们)如果然后我建议序列化,或者定义你期望重构对象拥有的常量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM