2016-09-21 83 views
0

請考慮下面的類:單元測試XML編碼問題

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; 
    } 
} 

有了以下的單元測試:

[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); 
    } 
} 

最後輸出:

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顯示開頭的3個額外字符。

那麼是什麼給?我如何去測試/比較生成的XML?我應該做什麼不同?

+1

有一個構造函數https://msdn.microsoft.com/en-us/library/s064f8w2(v=vs.110).aspx消除字節順序標記。 –

+0

感謝Martin,但我不想從文檔中刪除BOM,只是在測試期間忽略它。但是,您的鏈接確實指向了正確的方向,尋找什麼。 – CrnaStena

+0

爲什麼不創建一個測試函數來檢查BOM並將其餘字符串作爲字符串返回? –

回答

0

基於從馬丁和基思的建議,並與一些額外的研究,我結束了從生成的XML字節的單元測試去除BOM,以下列方式(基於以下SO article):

 var xmlBytes = new SampleXmlGenerator().GenerateDocumentBytes(); 
     var newXmlDoc = new XmlDocument {PreserveWhitespace = true}; 
     newXmlDoc.Load(new MemoryStream(xmlBytes)); 
     var actualBytes = Encoding.UTF8.GetBytes(newXmlDoc.OuterXml); 

現在單元測試經過!