在c#代码文件中内联原始XML

时间:2014-03-04 08:09:44

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

我正在创建一个对象序列化单元测试,并希望在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放在代码中而不进行修改?

3 个答案:

答案 0 :(得分:4)

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

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

    string data = Resources.TestData;
    

答案 1 :(得分:0)

不,编译器/解析器不允许它。

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

答案 2 :(得分:0)

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