0

我有这样的文件内容

XXX,AAAAAA,B,CC;Cont 123456;2.50;1;1;1;2;0;1;l;
XXX,AAAAAA,B,CC;Avboo;1.20;1;1;1;2;0;1;l;
XXX,AAAAAA,B,CC;Dartw esata garle;3.00;1;1;1;2;0;1;ccc; 

文件保存在 c:\myFile.txt

在我的 nunit 测试中,我试图在文件内容中创建精确的字符串,然后我想断言它们是相等的

[Test]
public void test()
{      
   string line1 = "XXX,AAAAAA,B,CC;Cont 123456;2.50;1;1;1;2;0;1;l;\r\n";
   string line2 = "XXX,AAAAAA,B,CC;Avboo;1.20;1;1;1;2;0;1;l;\r\n";
   string line3 = "XXX,AAAAAA,B,CC;Dartw esata garle;3.00;1;1;1;2;0;1;ccc;\r\n";    
   string expected = string.Concat(line1,line2,line3);
   var fileContent = File.ReadAllText(@"C:\myFile.txt");
   Assert.AreEqual(fileContent, expected);
}

尽管看起来应该是确切的字符串,但我遇到了错误

预期的字符串长度为 149,但为 154。字符串在索引 86 处不同

4

6 回答 6

4

如果删除最后一个换行符怎么办:

 string line3 = "XXX,AAAAAA,B,CC;Dartw esata garle;3.00;1;1;1;2;0;1;ccc;";

我认为您的文本文件的结尾不是换行符。

于 2013-03-13T12:32:38.257 回答
2

使用Environment.NewLine而不是\r\n.

于 2013-03-13T12:28:20.057 回答
1

您收到的消息很明确:

Expected string length 149 but was 154. Strings differ at index 86

它指向\r\n位置;所以我怀疑你的文件包含\n而不是\r\n在一起。

                                  position 86: \r found |
                                                        v
...;1;1;1;2;0;1;l;XXX,AAAAAA,B,CC;Avboo;1.20;1;1;1;2;0;1;l;XXX,AAAAAA,B,CC;
  • 由于这个原因,文件比较不同,因为在 86 位有一个意外的 \r。

所以你现在有 3 个额外的字符。

因为您的文本文件可能不以 结尾\r\n,所以现在您多了一个字符:

  • 这就是为什么你总共有 5 个额外字符(4 + 一个我还没有发现的额外字符)的原因:154 而不是 149。
于 2013-03-13T12:50:59.583 回答
0

您有一个额外的 NewLineChar in line3,以下代码可以正常工作:

[Test]
public void test()
{
    string line1 = "XXX,AAAAAA,B,CC;Cont 123456;2.50;1;1;1;2;0;1;l;\r\n";
    string line2 = "XXX,AAAAAA,B,CC;Avboo;1.20;1;1;1;2;0;1;l;\r\n";
    string line3 = "XXX,AAAAAA,B,CC;Dartw esata garle;3.00;1;1;1;2;0;1;ccc;";
    string expected = string.Concat(line1, line2, line3);
    var fileContent = File.ReadAllText(@"C:\myFile.txt");
}

你也可以在你的myfile.txt

于 2013-03-13T12:34:14.023 回答
0

另一种方法。

var actual = File.ReadAllLines(@"c:\abc.txt");
var expected = new List<string>();
expected.Add("line1");
expected.Add("line2");
expected.Add("line3");
Assert.AreEqual(expected, actual);

或者您可以在列表上执行一个 for 循环并逐行检查。

于 2013-03-13T12:40:12.583 回答
0

关于如何更好地进行测试,这里有很多很好的答案。但实际上这个问题有两个根本问题。

  1. 这不是单元测试,而是集成测试
  2. 如果您首先不知道文件的 .NET String 输出是什么,那么测试毫无意义。你需要先找出这个。

为此,我将首先调试测试并复制输出,File.ReadAllText("[filename]");然后将此输出粘贴到您的Assert.方法中。

单元/集成测试的主要关键之一是准确地知道测试的双方是什么。没有这个,你还不如不打扰。

另外,你在测试什么?

于 2013-03-13T12:45:24.327 回答