J'ai une unité de test qui permettra de tester pour voir si une méthode qui retourne le bon IEnumerable. La méthode s'appuie à l'aide de l'interface IEnumerable yield return
. La classe qu'il est un IEnumerable de est ci-dessous:
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; }
}
C'est la partie pertinente de la méthode:
foreach (var lookup in REGEX_MAPPING)
{
if (lookup.re.IsMatch(s))
{
yield return new Token { type = lookup.type, text = s };
break;
}
}
Si je stocker le résultat de cette méthode en actual
et de faire un autre énumérable expected
et de les comparer comme ceci:
Assert.AreEqual(expected, actual);
...l'assertion échoue.
J'ai écrit une méthode d'extension pour IEnumerable qui est similaire à Python zip fonction (il combine deux IEnumerables dans un ensemble de paires), et j'ai essayé ceci:
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
...et cela a fonctionné! Quelle est donc la différence entre ces deux Assert.AreEqual
s?