2017-03-27 24 views
0

我正在編寫一個代碼生成器,它將接受一個數據表,並使用它將從它在數據表中找到的內容生成鍋爐板c#代碼。Assert.AreEqual在將字符串與從光盤讀取的文件進行比較時失敗

我正在創建一個c#代碼文件,並將其與我的代碼生成器生成的字符串進行比較。

我從磁盤讀取代碼文件爲一個字符串,並將其與生成的字符串進行比較,並將字符串作爲參數傳遞給Assert.AreEqual - 失敗。如果我將生成的字符串寫出到文本文件並進行比較,文本看起來是相同的 - 但是文件大小略有不同,並且使用文件比較實用程序,文件末尾似乎還有一個額外的高級ascii類型字符這是通過我的代碼生成器創建的。

關於「upper ascii」字符,如果我使用十六進制編輯器比較文件,則在文件的開頭和結尾處有一些額外的十六進制值,這些十六進制值是使用Visual Studio創建的,並不存在於文件中由我的應用程序創建。這些十六進制值的開頭是:「EF BB BF」,最後的值是:「0D 0A」。

另一個線索可能會解釋一些事情:當我將生成的文件添加到Visual Studio中的項目中時,出現以下消息:「以下文件中的行結尾不一致。是否要標準化線路結局?「

單元測試的內容:

[TestMethod] 
    public void TestGenerateBDO() 
    { 

     const string originalCodePath = @"c:\temp\UnitTestGenerator\BugSource.cs"; 

     BusinessDomainGenerator generator = 
      new BusinessDomainGenerator(new System.Data.DataTable(), "BugsBDO", "Bug"); 

     // this adds the body of the text file 
     AddTestGenerateBDOCodeLines(generator); 

     // I've tried using the 2nd parameter of ReadAllText to pass 
     // different encodings - no difference 
     string originalCode = System.IO.File.ReadAllText(originalCodePath); 
     string formattedCode = generator.GetGeneratedCode(); 

     Assert.AreEqual(originalCode, formattedCode); 

    } 
+1

「文件的意圖和目的內容是相同的」 - 不,它們不是。你已經描述過它們的不同之處。如果文件大小不同,並且文件末尾還有一個額外的字符,那麼它們顯然不同! (我不確定你的意思是「一個額外的高級ASCII字符」)。 –

+0

你的權利 - 檔案不同,我不清楚我的意思是「意圖和目的」。爲了消除混淆,我修改了原始問題。 – Matt

回答

2

我通常做的這些情況:

  1. 調試單元測試,直到我到了兩個字符串進行比較
  2. 複製並粘貼串入文本編輯器(使用「文本展示器」)

Screenshot of how to open the text visualizer

  1. 如果差異不明顯,則使用diff工具。

請注意,0D 0A是「回車和換行」(\r\n),即新行。這可能是你的問題,因爲最後一個字符串\r\n與不帶字符串的字符串不同。如果是這種情況,您可以首先在兩個字符串上調用Trim()來解決這個問題。

EF BB BFbyte order mark,它出現在文件的開頭,表示該文件使用UTF-8編碼。當讀取文件時.Net框架將使用這些信息來決定使用哪種編碼,但它們不會成爲字符串的一部分,因此不會導致測試失敗。

+0

我已經推出了文本文件,所以我可以做比較,但我想確保我遵循了任何建議,所以我按照上面的建議進行了操作,並使用文本可視化工具進行復制和粘貼並進行比較。字符串顯示完全相同。然後我做的是保存通過複製字符串創建的文本文件,並通過「WriteAllText」將字符串的內容寫入文件。結果文件的大小爲1個字節。所以要清楚 - 我通過從文本可視化器和WriteAllText複製/粘貼文件來保存字符串的內容,並以不同的文件大小結束。 – Matt

+0

好吧,原來這是一個奇怪的追蹤鴨子。 – Matt

+0

在爲比較字符串構造的倒數第二個項目上,我在一個上使用AppendLine調用,在另一個上使用\ n。我沒有使用\ r \ n,所以AppendLine不匹配。這是進一步隱藏的,因爲它是第二個添加到字符串的部分。如果我刪除了最後一項,差異通過測試,因爲字符串被修剪。 – Matt

相關問題