c# - 字符串内容相同但长度不同

标签 c# .net unit-testing selenium string-comparison

我很难弄明白这一点。我正在编写一个单元测试来验证站点显示的 MD5 是否与文件的实际 MD5 匹配。我通过简单地抓取页面显示的内容然后计算我自己的文件 MD5 来做到这一点。我使用 Selenium WebDriver 获取页面上的文本。

正如预期的那样,字符串显示为相同...或者看起来是

当我尝试使用 Assert.AreEqualAssert.IsTrue 测试这两个字符串时,无论我如何尝试比较它们都失败

我试过以下方法:

Assert.AreEqual(md5, md5Text); //Fails
Assert.IsTrue(md5 == md5Text); //Fails
Assert.IsTrue(String.Equals(md5, md5Text)); //Fails
Assert.IsTrue(md5.Normalize() == md5Text.Normalize()); //Fails
Assert.AreEqul(md5.Normalize(), md5Text.Normalize()); //Fails

起初,我认为这两个字符串实际上是不同的,但在调试器中查看它们表明两个字符串完全相同 enter image description here

所以我试着看看它们的长度,那时我明白了原因

enter image description here

字符串的长度不同..所以我尝试对 md5 变量进行子字符串匹配 md5Text 变量的大小。我的想法是 md5 可能有一堆宽度为 0 的字符。然而,这样做摆脱了 md5

的后半部分

SOO,这一定意味着它们的不同编码正确吗?但是 Normalize() 不会解决这个问题吗?

这就是变量 md5 的创建方式

string md5;
using (var stream = file.Open()) //file is a custom class with an Open() method that returns a Stream
{
    using (var generator = MD5.Create())
    {
        md5 = BitConverter.ToString(generator.ComputeHash(stream)).Replace("-", "‌​").ToLower().Trim();
    }
}

这就是 md5Text 变量的创建方式

//I'm using Selenium WebDrvier to grab the text from the page
var md5Element = row.FindElements(By.XPath("//span[@data-bind='text: MD5Hash']")).Where(e => e.Visible()).First();
var md5Text = md5Element.Text;

我怎样才能通过这个测试?因为它应该通过(因为它们相同)

更新:

评论建议我将字符串转换为 char[] 并对其进行迭代。以下是结果 (http://pastebin.com/DX335wU8) 以及我为此添加的代码

        char[] md5Characters = md5.ToCharArray();
        char[] md5TextCharacters = md5Text.ToCharArray();

        //Use md5 length since it's bigger
        for (int i = 0; i < md5Characters.Length; i++)
        {
            System.Diagnostics.Debug.Write("md5: " + md5Characters[i]);

            if (i >= md5TextCharacters.Length)
            {
                System.Diagnostics.Debug.Write(" | Exhausted md5Text characters..");
            }
            else
            {
                System.Diagnostics.Debug.Write(" | md5Text: " + md5TextCharacters[i]);
            }
            System.Diagnostics.Debug.WriteLine("");
        }

我发现有趣的一件事是 md5 char 数组内部每隔 2 个字母就有一堆随机字符

enter image description here

最佳答案

.Replace("-", "‌ ")

你的""不为空,其实有一个"‌ 然后unicode 零宽度非连接符 + 零width space 然后 " 所以你不是用空字符串替换 "-" 而是插入额外的字符。

删除并重新键入 "" 或使用 String.Empty

关于c# - 字符串内容相同但长度不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42027701/

相关文章:

java - Mockito/PowerMocktio doNothing for none void 方法

javascript - 如何对 node-cron 作业进行单元测试

c# - NHibernate延迟加载和对象比较

c# - 从数组 C# 中删除字符串

c# - 您可以在静态上下文中引用非静态方法吗?

c# - 如何在RhinoMocks中按指定条件从方法返回值?

c# - 高效的临时数据集

c# - 如何调整颜色的亮度?

c# - Linux .Net Core 接收传入的套接字

C#:CommandLineParser 如何解析URL?