У меня есть unit test, чтобы проверить, возвращает ли метод правильный IEnumerable
. Метод строит перечислимое значение с помощью yield return
. Класс, который он перечислит, ниже:
enum TokenType
{
NUMBER,
COMMAND,
ARITHMETIC,
}
internal class Token
{
public TokenType type { get; set; }
public string text { get; set; }
public static bool operator == (Token lh, Token rh) { return (lh.type == rh.type) && (lh.text == rh.text); }
public static bool operator != (Token lh, Token rh) { return !(lh == rh); }
public override int GetHashCode()
{
return text.GetHashCode() % type.GetHashCode();
}
public override bool Equals(object obj)
{
return this == (Token)obj;
}
}
Это важная часть метода:
foreach (var lookup in REGEX_MAPPING)
{
if (lookup.re.IsMatch(s))
{
yield return new Token { type = lookup.type, text = s };
break;
}
}
Если я сохраню результат этого метода в actual
, сделайте еще один перечислимый expected
и сравните их, как это...
Assert.AreEqual(expected, actual);
..., утверждение терпит неудачу.
Я написал метод расширения для IEnumerable
, который похож на Python zip
function (он объединяет два IEnumerables в набор пар ) и попробовал это:
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
Это сработало! Итак, какова разница между этими двумя Assert.AreEqual
s?