Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否存在单元测试序列化点?_C#_Unit Testing_Serialization_Xml Serialization - Fatal编程技术网

C# 是否存在单元测试序列化点?

C# 是否存在单元测试序列化点?,c#,unit-testing,serialization,xml-serialization,C#,Unit Testing,Serialization,Xml Serialization,我有一个类,它序列化了一组要进行单元测试的对象(使用XML序列化) 我的问题是感觉我将测试XML序列化的.NET实现,而不是任何有用的东西。我还有一个小的鸡和蛋的场景,为了测试阅读器,我需要一个由编写器生成的文件来测试 我认为我最终要寻求反馈的问题(有3个,但都是相关的)是: 是否可以在不使用读卡器的情况下测试编写器 测试阅读器的最佳策略是什么(XML文件?录制/回放模拟)?您真正要做的是测试已反序列化对象的属性值吗 测试作者的最佳策略是什么 Xml序列化的背景信息 我没有使用模式,因此所有XM

我有一个类,它序列化了一组要进行单元测试的对象(使用XML序列化)

我的问题是感觉我将测试XML序列化的.NET实现,而不是任何有用的东西。我还有一个小的鸡和蛋的场景,为了测试阅读器,我需要一个由编写器生成的文件来测试

我认为我最终要寻求反馈的问题(有3个,但都是相关的)是:

  • 是否可以在不使用读卡器的情况下测试编写器
  • 测试阅读器的最佳策略是什么(XML文件?录制/回放模拟)?您真正要做的是测试已反序列化对象的属性值吗
  • 测试作者的最佳策略是什么 Xml序列化的背景信息

    我没有使用模式,因此所有XML元素和属性都与对象的属性匹配。由于没有模式,XmlSerializer只会忽略与每个对象的属性中的标记/属性不匹配的标记/属性(因此属性的值为null或默认值)。这里有一个例子

    <MyObject Height="300">
        <Name>Bob</Name>
        <Age>20</Age>
    <MyObject>
    
    反之亦然。如果对象更改为下面的,XML仍将成功反序列化,但FirstName将为空

    public class MyObject
    {
      public string FirstName { get;set; }
      public int Age { get;set; }
    
      [XmlAttribute]
      public int Height { get;set; }
    }
    

    无效的XML文件将正确反序列化,因此除非对MyObject的值运行断言,否则单元测试将通过。

    对我来说,这绝对属于“不要麻烦”类别。我不会对我的工具进行单元测试。但是,如果您编写了自己的序列化类,那么一定要对其进行单元测试。

    您需要能够进行向后兼容性吗?如果是这样的话,对旧版本生成的文件进行单元测试可能是值得的,这些旧版本仍然可以被新版本反序列化


    除此之外,如果您引入了任何“有趣”的内容,那么可能值得进行一次单元测试,以检查您是否可以序列化和反序列化,以确保您没有使用只读属性等做一些奇怪的事情。

    如果您无法改变类序列化的方式,然后测试.NET的XML序列化实现;-)

    如果序列化XML的格式很重要,那么您需要测试序列化。如果可以对其进行反序列化很重要,那么需要测试反序列化。

    如果要确保对象的序列化不会中断,请务必进行单元测试。如果您阅读了该类的MSDN文档:

    XmlSerializer无法序列化或反序列化以下内容:

    ArrayList的数组
    List的数组

    声明为无符号long的枚举还有一个特殊问题。此外,从.Net 3.5开始,任何标记为
    [过时]
    的对象都不会被序列化

    如果您有一组正在序列化的对象,那么测试序列化可能看起来很奇怪,但只需要有人编辑正在序列化的对象,以包含序列化中断的不受支持的条件之一


    实际上,您不是单元测试XML序列化,而是测试对象是否可以序列化。这同样适用于反序列化。

    看到您无法真正修复序列化,您不应该测试它-相反,您应该测试您自己的代码以及它与序列化机制交互的方式。例如,您可能需要对正在序列化的数据结构进行单元测试,以确保没有人意外更改字段或其他内容


    说到这里,我最近采用了一种做法,在编译时检查这些东西,而不是在执行单元测试时。这有点乏味,但我有一个组件可以遍历AST,然后我可以在T4模板中读取它,如果我遇到不应该出现的东西,我可以编写大量的
    #错误
    消息。

    我在某些情况下这样做过。。。不测试序列化本身,而是使用一些“已知良好”的XML序列化,然后将它们加载到我的类中,并检查所有属性(如适用)是否具有预期值


    这不会对第一个版本进行任何测试。。。但是,如果类不断发展,我知道我会发现格式中的任何突破性变化。

    我认为单元测试序列化是必要的,如果可以在版本之间读取数据是至关重要的。您必须使用“已知良好”数据进行测试(即,仅在当前版本中写入数据然后再次读取是不够的)

    你提到你没有一个模式。。。为什么不生成一个呢?要么用手(不是很难),要么用
    xsd.exe
    。然后您就可以使用一些东西作为模板,您可以使用
    XmlReader
    来验证这一点。目前我正在做大量关于xml序列化的工作,更新模式要比担心数据是否正确容易得多

    甚至
    XmlSerializer
    也会变得复杂;特别是如果您涉及子类(
    [xmlclude]
    )、自定义序列化(
    IXmlSerializable
    )或非默认的
    XmlSerializer
    构造(在运行时将附加元数据传递给构造函数)。另一种可能性是创造性地使用
    [XmlIngore]
    [XmlAnyAttribute]
    [xmlanyement]
    ;例如,在版本X中,您可能支持(仅)往返的意外数据,但将其存储在版本Y中的已知属性中


    一般来说,对于序列化:

    原因很简单:你可以破坏数据!你做得有多差取决于序列化程序;例如,使用
    BinaryFormatter
    (我知道问题是
    XmlSerializer
    ),只需从以下内容更改:

    public string Name {get;set;}
    

    可能是,因为字段名已更改(并且
    BinaryFormatter
    fie
    public string Name {get;set;}
    
    private string name;
    public string Name {
        get {return name;}
        set {name = value; OnPropertyChanged("Name"); }
    }
    
    You - Bob, I want you to jot down the following: "small yellow duck." Bob - OK, got it. You - Now, read it back to me. Bob - "small yellow duck" You - Bob, I want you to jot down the following: "small yellow duck." Bob - OK, got it. You - Alice, can you please check what Bob wrote? Alice - OK, he's got it. You - Alice, can you please jot down a few words? Alice - Done. You - Bob, can you please read them? Bob - "red fox" Alice - Yup, that sounds right.