Visual Studio 如何在xml文件中使用displayname

zzwlnbp8  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(130)

我是一名学生,我找不到我如何给我的每一个测试的名称,当我使用xml文件。当我们使用datarow时,我们可以使用displayname=""。然后当我运行测试时,每个测试都有自己的名字。当我在测试中使用xml文件时,我该怎么做?im usung vs c#我的xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<tar>
    <IsEarlier  Name="General" DisplayName="General">
        <hour1>13</hour1>
        <min1>15</min1>
        <hour2>13</hour2>
        <min2>17</min2>
        <res>true</res>
    </IsEarlier>

    <IsEarlier>
        <hour1>13</hour1>
        <min1>15</min1>
        <hour2>13</hour2>
        <min2>15</min2>
        <res>false</res>
    </IsEarlier>
    
    <IsEarlier DisplayName="check_clock">
        <hour1>13</hour1>
        <min1>15</min1>
        <hour2>13</hour2>
        <min2>15</min2>
        <res>false</res>
    </IsEarlier>

</tar>

我的测试:

[TestClass]
    public class UnitTest1
    {

        private TestContext context;
        public TestContext TestContext
        {
            get { return context; }
            set { context = value; }
        }

        [TestMethod]
        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
            @"|DataDirectory|\TestDate\Clock.xml",
            "IsEarlier",
            DataAccessMethod.Sequential)]
        public void IsEarlierByXML()
        {
            int h1  = Convert.ToInt32(TestContext.DataRow["hour1"].ToString());
            int m1  = Convert.ToInt32(TestContext.DataRow["min1"].ToString());
            Clock.Clock c1 = new Clock.Clock(h1, m1);

            int h2 = Convert.ToInt32(TestContext.DataRow["hour2"].ToString());
            int m2 = Convert.ToInt32(TestContext.DataRow["min2"].ToString());
            Clock.Clock c2 = new Clock.Clock(h2, m2);

            bool expected = Convert.ToBoolean(TestContext.DataRow["res"].ToString());
            bool actual;

            actual = c1.IsEarlier(c2);

            Assert.IsTrue(expected == actual);
        }
dy2hfwbg

dy2hfwbg1#

  • 类文件将是.cs,最佳实践通常是每个类一个文件,类名和文件名匹配,如IsEarlier.cs和Tar.cs。如果你想让它们在同一个文件中,像ClockTestData.cs这样的东西会有意义,也许列表类的名称相同,而不是“Tar”。

一旦定义了IsEarlierTar类(Luuk帮助),就可以使用XmlSerializer用XML内容填充该类。https://learn.microsoft.com/en-us/dotnet/standard/serialization/how-to-deserialize-an-object(类似这样的东西)

var xmlSerializer = new XmlSerializer(typeof(Tar));
using var fileStream = new FileStream("clock.xml", FileMode.Open);
var tar = (Tar)xmlSerializer.Deserialize(fileStream);

(Note在我的示例中,对象与类具有相同的名称,除了camelCase与PascalCase)。
然后,您就可以循环遍历tar.IsEarlier列表中的IsEarlier项,并执行每个测试。例如,如果isEarlier是在foreach或for循环中分配的对象,

Clock.Clock c1 = new Clock.Clock(isEarlier.Hour1, isEarlier.Min1);
lymnna71

lymnna712#

(BTW:Visual Studio中存在相同的选项。通过Edit/Paste Special/Paste XML as Classes
它将显示可用于序列化XML的C#代码

/* 
    Licensed under the Apache License, Version 2.0
    
    http://www.apache.org/licenses/LICENSE-2.0
    */
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
    [XmlRoot(ElementName="IsEarlier")]
    public class IsEarlier {
        [XmlElement(ElementName="hour1")]
        public string Hour1 { get; set; }
        [XmlElement(ElementName="min1")]
        public string Min1 { get; set; }
        [XmlElement(ElementName="hour2")]
        public string Hour2 { get; set; }
        [XmlElement(ElementName="min2")]
        public string Min2 { get; set; }
        [XmlElement(ElementName="res")]
        public string Res { get; set; }
        [XmlAttribute(AttributeName="Name")]
        public string Name { get; set; }
        [XmlAttribute(AttributeName="DisplayName")]
        public string DisplayName { get; set; }
    }

    [XmlRoot(ElementName="tar")]
    public class Tar {
        [XmlElement(ElementName="IsEarlier")]
        public List<IsEarlier> IsEarlier { get; set; }
    }

}

这个类还包含属性DisplayName的定义。

相关问题