C# 不同的断言结果来自;“相同”;一串

C# 不同的断言结果来自;“相同”;一串,c#,.net,unit-testing,C#,.net,Unit Testing,我正在尝试读取一个文件并断言一些.Contains,以确保将正确的数据写入该文件。我有5行需要断言,我认为用for循环遍历它们是明智的。但遗憾的是,for循环中的断言产生的结果与5个硬编码断言不同。代码如下: string writtenFile = File.ReadAllText(completeFilePathWithNameAndExtension); Assert.IsTrue(writtenFile.Contains("2000-04-09 08:13:15:015 Test: 1

我正在尝试读取一个文件并断言一些.Contains,以确保将正确的数据写入该文件。我有5行需要断言,我认为用for循环遍历它们是明智的。但遗憾的是,for循环中的断言产生的结果与5个硬编码断言不同。代码如下:

string writtenFile = File.ReadAllText(completeFilePathWithNameAndExtension);

Assert.IsTrue(writtenFile.Contains("2000-04-09 08:13:15:015 Test: 1."));
Assert.IsTrue(writtenFile.Contains("2000-04-09 08:13:15:030 Test: 2."));
Assert.IsTrue(writtenFile.Contains("2000-04-09 08:13:15:045 Test: 3."));
Assert.IsTrue(writtenFile.Contains("2000-04-09 08:13:15:060 Test: 4."));

for (int i = 1; i <= 4; i++)
    {

        Assert.IsTrue(writtenFile.Contains(
           "2000-04-09 08:13:15:0" + i*15 + " Test: " + i + "."));
    }

Value of writtenFile: "Timestamp                \tData           \t\r\n2000-04-09 08:13:15:000\tTest: 0. \t\r\n2000-04-09 08:13:15:015\tTest: 1. \t\r\n2000-04-09 08:13:15:030\tTest: 2. \t\r\n2000-04-09 08:13:15:045\tTest: 3. \t\r\n2000-04-09 08:13:15:060\tTest: 4. \t\r\n"     
string writenfile=File.ReadAllText(completeFilePathWithNameAndExtension);
IsTrue(writenfile.Contains(“2000-04-09 08:13:15:015测试:1”);
IsTrue(writenfile.Contains(“2000-04-09 08:13:15:030测试:2”);
IsTrue(writenfile.Contains(“2000-04-09 08:13:15:045 Test:3”);
IsTrue(writenfile.Contains(“2000-04-09 08:13:15:060测试:4”);

对于(inti=1;i好的,我将字符串更改为(“2000-04-09 08:13:15:0{0}\tTest:{1}.”,k*15,k)(在{0}和Test之间添加了\t)使其工作,遗憾的是,我仍然无法理解为什么硬编码断言在没有\t的情况下工作。

正如您在示例中使用4行看到的:

Assert.IsTrue(writtenFile.Contains("2000-04-09 08:13:15:060 Test: 4."));
现在在你的循环中你正在做:

Assert.IsTrue(writtenFile.Contains("2000-04-09 08:13:15:0" + i * 15 + " Test: " + i + "."));
这应该给你一个提示,假设
10*15==150
,那么字符串结果将是
“2000-04-09 08:13:15:0150\tTest:10.”
,而不是
“2000-04-09 08:13:15:150\tTest:10.”


您应该使用的是
“2000-04-09 08:13:15:”+(i*15)。ToString(“D3”)+“\t测试:“+i+”

所以您只有这4个字符串,而不是更多?不,但我想展示如何实现更大的可伸缩性。如果您有更多字符串,当
i
大于6时,将产生不正确的结果(如“0105”而不是“105”).NET字符串是UTF16。没有怪物。如果比较失败,这是因为字符串不同。失败的实际字符串是什么?你能发布一个可复制的示例吗?因此在前4行中定义的文本字符串中有一个“制表符”?例如Assert.IsTrue(writenfile.Contains)(“2000-04-09 08:13:15:015(此处为制表符而非空格)测试:1。”);在“编辑”菜单中,选择“高级…”查看空白。如果使用制表符,则会将其显示为右箭头。这就是它工作的原因。您必须“复制”“这些字符串直接来自文件,因此粘贴时它会保留选项卡。而当您形成自己的字符串时,您忘记添加\t.No repro。您可能在不知不觉中复制了选项卡,因为只要生成的字符串相同,这两个测试都会返回相同的结果-即它们包括选项卡使用:(“2000-04-09 08:13:15:{0:D3}\t测试:{1}.”,k*15,k)…因此k可以是任何“合理”的值,并且它仍然会创建格式正确的字符串,例如当k大于4时。谢谢,它工作得非常完美!