【问题标题】:Inline raw XML inside a c# code file在 c# 代码文件中内联原始 XML
【发布时间】:2014-03-04 08:09:43
【问题描述】:

我正在创建一个对象序列化单元测试,并希望将对象的 XML 内联到 c# 代码单元测试文件中。 我知道内联它的最简单方法是使用 @ 前缀作为字符串:

var xml = @"<Something> 
                 <AnotherSomething/>
                 <AnotherSomething/>
            </Something>";

我的问题是我的 XML 包含属性并且它非常大,为了内联它,我需要检查所有 XML 并为 XML 中的每个“””添加转义,这样做非常大XML 节点很难,维护也很困难 -

var xml = @"<Something Att=""s"" Att2=""gg""> 
                     <AnotherSomething/>
                     <AnotherSomething/>
           </Something>";

我不想将 XML 作为另一个文件并将其标记为部署项 -

[DeploymentItem("Something.xml")]

因为它需要单元测试从磁盘加载文件,这会使单元测试慢得多,我可能有很多这样的。

有没有其他方法可以在不修改的情况下将 XML 放入代码中?

【问题讨论】:

  • 您可以尝试放入资源文件中,然后从测试程序集中加载该文件。它仍在流式传输它,但来自程序集内部,而不是来自磁盘。确保资源是嵌入式的,而不仅仅是磁盘上文件的链接
  • @leon 这是个好主意,如果可以的话,将其作为示例发布,或者您可以添加此链接 - adamprescott.net/2012/07/26/…,我会将其标记为正确答案

标签: c# xml unit-testing code-editor


【解决方案1】:

正如@leon 的评论建议使用资源文件,但我更进一步。

  1. 添加文件夹资源
  2. 添加 Resources.resx 文件(根据需要重命名)
  3. 使用测试数据 TestData.xml 添加您的 xml 文件
  4. 使其成为嵌入式资源
  5. 将 xml 文件从解决方案资源管理器拖到 Resource.resx
  6. 确保您的 TestData.xml 资源类型是文本而不是二进制
  7. 编译

现在将您的测试数据称为

string data = Resources.TestData;

【讨论】:

  • 如果他有许多单元测试,对于不同的序列化场景(许多 xml 文件,远离使用它们的代码),这可能会变得混乱。 我可能有很多这样的[单元测试]。
  • 如果你愿意,它会变得一团糟。另一方面,如果您小心谨慎,那么您将获得有组织的测试和测试数据的奖励。当您查看测试数据时,它将在您的 IDE 中以其本机形式和语法颜色呈现
【解决方案2】:

您可以使用 linq to xml 对象创建 xml 表示,而不是 xml 字符串。第二个示例如下所示:

var xml = 
    new XElement("Something",
        new XAttribute("Att", "s"),
        new XAttribute("Att2", "gg"),
        new XElement("AnotherSomething"),
        new XElement("AnotherSomething"));

使用它的更多原因是确保 xml 有效性、自动转义特殊字符、转换为字符串时的更多格式选项,以及 - 更容易处理。

【讨论】:

    【解决方案3】:

    不,编译器/解析器不允许这样做。

    您可以将所有 xml 放在一个文件中(以某种有效的结构),并让一个实用程序类加载整个内容并在测试之间缓存它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2017-07-19
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多