我有一个单元测试,用于检查方法是否返回正确的 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
函数(将两个 IEnumerables 组合成一组对),并尝试执行以下操作:
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
它成功了!那么这两个 Assert.AreEqual
有什么区别呢?