首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试Xml编码问题

单元测试Xml编码问题
EN

Stack Overflow用户
提问于 2016-09-21 20:21:51
回答 2查看 600关注 0票数 0

考虑下一课:

代码语言:javascript
复制
public class SampleXmlGenerator
{
    public byte[] GenerateDocumentBytes()
    {
        byte[] fileBytes;
        using (var xmlStream = new MemoryStream())
        {
            using (var myWriter = new XmlTextWriter(xmlStream, Encoding.GetEncoding("UTF-8")))
            {
                myWriter.Formatting = Formatting.Indented;
                myWriter.Indentation = 4;
                myWriter.IndentChar = ' ';
                myWriter.WriteStartDocument();
                myWriter.WriteStartElement("foo");
                myWriter.WriteString("bar");
                myWriter.WriteEndElement(); // end foo

                myWriter.Flush();

                fileBytes = xmlStream.ToArray();
            }
        }

        return fileBytes;
    }
}

通过以下单元测试:

代码语言:javascript
复制
[TestClass]
public class TestSampleXmlGenerator
{
    [TestMethod]
    public void TextEmptyDocument()
    {
        var actualBytes = new SampleXmlGenerator().GenerateDocumentBytes();
        var actualUtf8String = Encoding.UTF8.GetString(actualBytes);
        Console.Out.WriteLine("// actualUtf8String");
        Console.Out.WriteLine(actualUtf8String);

        var actualDefaultString = Encoding.Default.GetString(actualBytes);
        Console.Out.WriteLine("// actualDefaultString");
        Console.Out.WriteLine(actualDefaultString);


        var expectedString = @"<?xml version=""1.0"" encoding=""utf-8""?>
<foo>bar</foo>";
        var expectedBytes = Encoding.UTF8.GetBytes(expectedString);

//      var expectedBytes = Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(@"<?xml version=""1.0"" encoding=""utf-8""?>
//<foo>bar</foo>"));
//      var expectedString = Encoding.UTF8.GetString(expectedBytes);

        Console.Out.WriteLine("// expectedString");
        Console.Out.WriteLine(expectedString);

        Assert.AreEqual(expectedBytes.Length, actualBytes.Length);
        //Assert.AreEqual(expectedString, actualUtf8String);
    }
}

最后是产出:

代码语言:javascript
复制
Assert.AreEqual failed. Expected:<54>. Actual:<57>. 

// actualUtf8String
<?xml version="1.0" encoding="utf-8"?>
<foo>bar</foo>

// actualDefaultString
<?xml version="1.0" encoding="utf-8"?>
<foo>bar</foo>

// expectedString
<?xml version="1.0" encoding="utf-8"?>
<foo>bar</foo>

expectedStringactualUtf8String看起来是一样的,但事实并非如此。

actualDefaultString在开始时显示了三个额外的字符。

那是怎么回事?如何测试/比较生成的XML?我该怎么做才好呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-21 21:57:51

你看到的是BOM的序言

https://msdn.microsoft.com/en-us/library/system.text.encoding.getpreamble(v=vs.110).aspx

您可以测试它,也可以不序列化它。

票数 1
EN

Stack Overflow用户

发布于 2016-09-22 14:14:54

根据Martin和Keith的建议,并通过一些额外的研究,我以以下方式(基于下面的SO article)从单元测试中生成的XML字节中删除了BOM:

代码语言:javascript
复制
        var xmlBytes = new SampleXmlGenerator().GenerateDocumentBytes();
        var newXmlDoc = new XmlDocument {PreserveWhitespace = true};
        newXmlDoc.Load(new MemoryStream(xmlBytes));
        var actualBytes = Encoding.UTF8.GetBytes(newXmlDoc.OuterXml);

现在单元测试通过了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39625909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档