【问题标题】:Unit testing XML deserialisation单元测试 XML 反序列化
【发布时间】:2016-05-04 09:31:41
【问题描述】:

我是单元测试的新手,我想知道单元测试 xml 反序列化的最佳实践是什么。

考虑以下 xml:

<people>
  <person id="1">
    <name>Joe</name>
    <age>28</age>
  </person>
  <person id="2">
    <name>Jack</name>
    <age>38</age>
  </person>
</people>

以及下面的模型类:

    [XmlRoot(ElementName ="people")]
    public class People
    {
        public People() { PeopleList = new List<Person>(); }

        [XmlElement("person")]
        public List<Person> PeopleList { get; set; }
    }

    public class Person
    {
        [XmlAttribute("id")]
        public int id { get; set; }

        [XmlElement("name")]
        public string Name { get; set; }

        [XmlElement("age")]
        public int Age { get; set; }
    }

我使用以下方法反序列化 xml:

        public List<Person> GetListOfPeople()
        {
            People plist = new People();

            string content;
            using (StreamReader sr = new StreamReader(manager.Open("People.xml")))
            {
                var serializer = new XmlSerializer(typeof(People));
                plist = (People)serializer.Deserialize(sr);
            }


            return plist.PeopleList;
        }

对上面的 GetListOfPeople 方法进行单元测试的最佳方法是什么?

【问题讨论】:

    标签: c# xml unit-testing xml-deserialization


    【解决方案1】:

    如果您可以更改方法以将 xml 文件作为输入参数,则可以创建一个示例 xml 文件并将其添加到您的测试项目中。由于您知道 xml 文件的值,因此可以直接开始比较值。

    考虑到您将使用您在测试中提供的示例文件,您可以像这样进行验证:

    var persons = x.GetListOfPeople("sample.xml");
    Assert.AreEqual("Joe", persons[0].Name);
    Assert.AreEqual(38, persons[1].Age);
    

    如果 xml 文件从某个来源进入您的代码,并且您认为它不能一直遵循您的 xml 架构,那么您可能可以再次创建一些违反您的架构的示例 xml 文件并准备要调用的测试如果架构不正确,您的方法应该引发一些异常。

    希望这会有所帮助。

    【讨论】:

    • 这是有道理的。因此,我将有一个有效“samlpe.xml”的测试方法,以及一个带有无效 xml 样本的测试方法,它将应用 ExpectedException 属性。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2011-06-24
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多