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

Mat*_*att 1 c# unit-testing assert

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

我正在创建 ac# 代码文件,并将其与代码生成器生成的字符串进行比较。

我从磁盘读取代码文件到一个字符串,并将其与生成的字符串进行比较,并将该字符串作为参数传递给 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); 

    }
Run Code Online (Sandbox Code Playgroud)

Jus*_*tin 5

在这些情况下我通常会做什么:

  1. 调试单元测试,直到我得到要比较的两个字符串
  2. 将字符串复制并粘贴到文本编辑器中(使用“文本可视化器”)

如何打开文本可视化工具的屏幕截图

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

注意0D 0A是“回车换行”(\r\n),即换行。这很可能是您的问题,因为末尾带有 a 的字符串与\r\n没有的字符串不同。如果是这种情况,您可能可以通过首先调用Trim()两个字符串来处理此问题。

EF BB BF是一个字节顺序标记,出现在文件的开头,表示文件是用 UTF-8 编码的。读取文件时,.Net 框架将使用此信息来决定使用哪种编码,但它们不会成为字符串的一部分,因此不会导致您的测试失败。