1

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

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 放入代码中?

4

3 回答 3

4

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

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

现在将您的测试数据称为

string data = Resources.TestData;
于 2014-03-04T08:23:27.207 回答
1

您可以使用 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 有效性、自动转义特殊字符、转换为字符串时的更多格式选项,以及 - 更容易处理。

于 2014-03-04T08:27:51.053 回答
0

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

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

于 2014-03-04T08:10:58.283 回答