比较c#中的字符串

时间:2013-03-13 12:25:36

标签: c# .net

我有像这样的文件内容

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处有所不同

6 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

使用Environment.NewLine代替\r\n

答案 2 :(得分: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 \ n。

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

因为您的文本文件可能不会以\r\n结尾,所以现在您还有一个额外的字符:

  • 这就是为什么你总共有5个额外的字符(4 +额外的字符我还没有发现)的原因:154而不是149。

答案 3 :(得分:0)

line3中有额外的NewLineChar ,以下代码正常运行:

[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

中添加额外的NewLineChar

答案 4 :(得分: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循环并逐个检查每一行。

答案 5 :(得分:0)

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

  1. 这不是单元测试,而是集成测试
  2. 如果您不知道文件的.NET String输出是什么,那么测试毫无意义。你需要先找到它。
  3. 为此,我首先调试测试并复制File.ReadAllText("[filename]");的输出然后将此输出粘贴到Assert.方法中。

    单元/集成测试的主要关键之一是确切地知道测试的两个方面 。如果没有这个,你可能不会打扰。

    另外,你在测试什么?