为什么Assert.AreEqual()会因字符串和DateTimeFormatter而失败?

时间:2017-02-21 08:03:35

标签: c# date time formatting string-formatting

我已经编写了以下单元测试来测试日期时间格式:

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

1 个答案:

答案 0 :(得分:2)

八位字节e2 80 8e表示actual字符串中有多个U + 200E字符。 U + 200E是一个控制字符,用于覆盖双向文本算法,并坚持从左到右写入后面的内容,即使它通常是正确写入的情况(例如希伯来语或阿拉伯字符) -to左。

expected字符串没有它们。

据推测,控制字符被复制到您的测试数据或您正在测试的格式化程序的实际源中。在后一种情况下,很高兴测试能够抓住它。 (或者,也许它出于某种原因意味着存在)。