2017-02-03 5 views
3

Мне трудно понять это. Я пишу тест Unit, который проверяет, что MD5, который показывает сайт, соответствует фактическому MD5 файла. Я делаю это, просто захватывая, что показывает страница, а затем вычисляет мой собственный MD5 файла. Я получаю текст на странице, используя Selenium WebDriver.То же строковое содержимое, но разная длина

Как и ожидалось, строки отображаются как то же самое ... или это, кажется

Когда я пытаюсь проверить две строки с помощью Assert.AreEqual или Assert.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

Струны разные lengths..so Я попытался подстроками в md5 переменного соответствуют размеру переменной md5Text. Мое мышление здесь было, возможно, у md5 была пучка из 0 символов ширины. Однако делать это избавилась от половины md5

СОО, это должно означать их в разных кодировках правильно? Но не будет 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; 

Как я могу сделать этот тест пройти? как это должно быть прохождение (с они то же самое)

UPDATE:

Комментарии предложил мне включить строки в полукокса [] и итерацию над ним.Вот результаты этого (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 символ имеет кучу случайных символов внутри него каждые 2 буквы

enter image description here

+5

Изучите 'var contents = md5.ToCharArray()' в отладчике и посмотрите, где/какие дополнительные байты. –

+1

Что произойдет, если вы перечислите оба символа char char и сравните их? –

ответ

4

.Replace("-", "‌​")

Ваш "" не пуст, есть на самом деле "‌​ затем юникода нулевая ширина non-joiner + нулевая ширина пробела, то ", поэтому вы не заменяете "-" пустой строкой, а добавляете дополнительные символы.

Удалить и перепечатать "" или использовать String.Empty.

+1

** ДА **, все было. При попытке удалить '' '' в IDE мне пришлось удалять backspace 4 раза вместо 2. Я заменил его на 'String.Empty', и тест теперь проходит. – edkek

Смежные вопросы