2013-03-13 53 views
0

我有这样在C#中比较字符串

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); 
} 

Althout它看起来像它应该是我收到提示

精确匹配

Excpected字符串长度149但154串在指数86

+11

你在调试器中看看它们,看看索引86有什么不同吗? – millimoose 2013-03-13 12:27:03

+0

你是否检查过File.ReadAllText()'? – 2013-03-13 12:27:56

+1

您可能需要在期望的字符串前添加一个'@'字符,即'string line1 = @“XXX ...”;' – oleksii 2013-03-13 12:28:05

回答

4

,如果你删除最后一个换行符什么:

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

我觉得你的文本文件的到底是不是一个换行符。

+0

这是长度差异最可能的原因。关于不匹配,就是那个奇怪的符号(字母?)'l',它可能看起来像数字'1',并且您可能错误地键入了它。 – Sinatr 2013-03-13 12:42:15

+0

这是一个很好且正确的答案,特定于测试中的错误。但并没有真正解决核心问题 - http://stackoverflow.com/questions/15385301/comparing-strings-in-c-sharp/15385736#15385736 – LiverpoolsNumber9 2013-03-13 12:50:36

2

使用Environment.NewLine,而不是\r\n不同。

+3

有人可以评论其downvote? – 2013-03-13 12:29:49

0

你有一个额外NewLineChar在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

0

另一种方法添加一个额外的NewLineChar。

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循环,并逐一检查每一行。

0

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

  1. 它不是一个单元测试,它是一个集成测试
  2. 如果你不知道该文件的.NET字符串输出是摆在首位什么,测试是没有意义的。你需要首先找到它。

要做到这一点,我会先调试试验和复制的File.ReadAllText("[filename]");输出那么这个输出粘贴到您的Assert.方法/秒。

单元/集成测试的主要关键之一是准确知道测试的两侧是。没有这个,你可能不打扰。

另外,你在测试什么?

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; 
  • 为此,文件comparaison不同,因为在该位置86

所以你现在3个额外的字符一个意想不到\ r。

因为你的文本文件时可能不会有\r\n结束了,现在你又多了一个额外的字符:

  • 这就是为什么你一共有5个额外的字符(4 +额外字符我没有现货还没有):154而不是149.