Assert.AreEqual 将字符串与从光盘读取的文件进行比较时失败

Assert.AreEqual failing when comparing a string to a file read from disc

我正在编写一个代码生成器,它将接受数据 table,并使用它将根据在数据 table 中找到的内容生成样板 C# 代码。

我正准备创建一个 c# 代码文件并将其与我的代码生成器生成的字符串进行比较。

我将代码文件从磁盘读入一个字符串,并将其与生成的字符串进行比较,并将该字符串作为参数传递给 Assert.AreEqual - 但失败了。如果我将生成的字符串写到一个文本文件中并进行比较,文本看起来是相同的——但是文件大小略有不同,并且使用文件比较实用程序,文件末尾似乎有一个额外的大写 ascii 类型字符这是通过我的代码生成器创建的。

关于 "upper ascii" 个字符,如果我用十六进制编辑器比较文件,在用 Visual Studio 创建的文件的开头和结尾有一些额外的十六进制值不存在于我的应用程序创建的文件中。开头的十六进制值是:"EF BB BF",结尾的值是:“0D 0A”。

一条可以解释某些事情的额外线索:当我将生成的文件添加到 Visual Studio 中的项目时,我看到消息:"The line endings in the following file are not consistent. Do you want to normalize the line endings?"

单元测试内容:

    [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. 调试单元测试,直到我得到正在比较的两个字符串
  2. 将字符串复制并粘贴到文本编辑器中(使用 "Text Visualizer")

  1. 如果差异不明显,请使用差异工具。

请注意,0D 0A 是 "carriage return and line feed" (\r\n),即换行。这很可能是您的问题,因为末尾带有 \r\n 的字符串与没有的字符串不同。如果是这种情况,您可以先在两个字符串上调用 Trim() 来处理这个问题。

EF BB BF 是一个 byte order mark 并且出现在文件的开头以指示该文件以 UTF-8 编码。读取文件时,.Net 框架将使用此信息来决定使用何种编码,但它们不会成为字符串的一部分,因此不会导致测试失败。