2017-02-21 72 views
1

Я написал следующий тест единицы на момент даты испытания форматирования:Почему Assert.AreEqual() не подходит для строки и DateTimeFormatter?

using System; 
using Windows.Globalization.DateTimeFormatting; 
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework; 

namespace MyTests 
{ 
    [TestClass] 
    public class DateTimeFormatterTests 
    { 
     [DataTestMethod] 
     [DataRow(2, 3, 2017, "en", "Thursday, March 2")] 
     [DataRow(2, 3, 2017, "de", "Donnerstag, 2. März")] 
     public void Long_date_without_year_should_match_expected(int day, int month, int year, string regionCode, string expected) 
     { 
      DateTimeFormatterformatter = new DateTimeFormatter("dayofweek month day", new[] { regionCode }); 
      string actual = formatter.Format(new DateTime(year, month, day)); 
      Assert.AreEqual(expected, actual); 
     } 
    } 
} 

Я не понимаю, почему утверждение не со следующей ошибкой:

{"Assert.AreEqual failed. Expected:<Thursday, March 2>. Actual:<‎Thursday‎, ‎March‎ ‎2>. "} 

Является ли это потому, что строки имеют разные кодирование?

После преобразования обе строки в массив байтов с использованием UTF8, кодирующий содержание байтовых массивов выглядит следующим образом:

реально:
e2 80 8e 54 68 75 72 73 64 61 79 e2 80 8e 2c 20 e2 80 8e 4d 61 72 63 68 e2 80 8e 20 e2 80 8e 32

ожидается: 54 68 75 72 73 64 61 79 2c 20 4d 61 72 63 68 20 32

+0

Каков тип 'актуальный'? –

+0

Строки не имеют кодировки, кодирование вступает в игру, когда вы пытаетесь преобразовать строку в/из байтов. –

+0

Попробуйте сравнить их как массивы байтов, начиная с 'Encoding.UTF8.GetBytes (фактического)' и аналогичного для ожидаемого, посмотрите, о чем он жалуется. –

ответ

2

октетов e2 80 8e показать, что у вас есть несколько символов U + 200E в строке actual. U + 200E является управляющим символом для переопределения двунаправленного текстового алгоритма и настаивает на том, что следующее следует писать слева направо, даже если это случай (например, иврит или арабский символ), который обычно записывается справа налево, оставил.

У строки expected их нет.

Предположительно, что контрольный символ был скопирован либо в ваши тестовые данные, либо в фактический источник тестируемого форматирования. В последнем случае будьте рады, что тестирование поймало его. (В качестве альтернативы, возможно, это должно быть там по какой-то причине).

+0

Поскольку это переменная 'actual', которая имеет эти символы, похоже, что вывод DateTimeFormatter - это то, что содержит эти кодовые точки. –

+0

@ LasseV.Karlsen делает последние два предложения (что это ошибка в DateTimeFormatter или что она должна быть там) остальные возможности. –