Ich habe einen Komponententest, um zu überprüfen, ob eine Methode die richtige IEnumerable
zurückgibt. Die Methode erstellt das Enumerable mit yield return
. Die Klasse, die es ist eine zählbare von unter:Wie bestimmt Assert.AreEqual die Gleichheit zwischen zwei generischen IEnumerables?
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;
}
}
Dies ist der relevante Teil des Verfahrens:
foreach (var lookup in REGEX_MAPPING)
{
if (lookup.re.IsMatch(s))
{
yield return new Token { type = lookup.type, text = s };
break;
}
}
Wenn ich das Ergebnis dieser Methode in actual
speichern, eine andere zählbare expected
machen, und vergleiche sie so ...
Assert.AreEqual(expected, actual);
..., die Assertion schlägt fehl.
Ich schrieb eine Erweiterungsmethode für IEnumerable
, die zu Python's zip
function ähnlich ist (es verbindet zwei IEnumerables in eine Menge von Paaren) und versucht, dies:
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
Es hat funktioniert! Also, was ist der Unterschied zwischen diesen beiden Assert.AreEqual
s?
@ Jason Baker: bitte das der falsche nicht nehmen Sie Hast du gedacht, dass die Tatsache, dass du eine Frage wie diese stellen musst, bedeuten könnte, dass du die Dinge zu kompliziert machst? –
Ähm ... Nein, nicht wirklich. : Könntest du mich auf etwas hinweisen, wo ich die Dinge kompliziert mache? –
Ich bin auch nicht davon überzeugt, dass "text.GetHashCode()% type.GetHashCode();" als Rückgabewert für GetHashCode() ist eine gute Idee ... –