Mam test jednostki, aby sprawdzić, czy metoda zwraca poprawną IEnumerable
. Metoda buduje przeliczalne przy użyciu yield return
. Klasa że jest przeliczalny na to poniżej:W jaki sposób Assert.AreEqual określa równość dwóch ogólnych 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;
}
}
Jest to istotne częścią metody:
foreach (var lookup in REGEX_MAPPING)
{
if (lookup.re.IsMatch(s))
{
yield return new Token { type = lookup.type, text = s };
break;
}
}
Gdybym zapisać wynik tej metody w actual
, dokonać innego enumerable expected
, i porównaj je w ten sposób ...
Assert.AreEqual(expected, actual);
... Asercja nie udaje się.
napisałem metodę rozszerzenia dla IEnumerable
że jest podobny do Python's zip
function (łączy dwie IEnumerables na zestaw par) i próbowałem to:
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
Udało się! Jaka jest różnica między tymi dwoma Assert.AreEqual
s?
@Jason Baker: proszę nie brać tego niepowołane sposób, czy uważasz, że to, że musisz zadać takie pytanie, może oznaczać, że robisz rzeczy zbyt skomplikowane? –
Erm ... nie, niezupełnie. :-) Czy możesz wskazać mi, gdzie robię rzeczy skomplikowane? –
Ponadto, nie jestem przekonany, że za pomocą "text.GetHashCode()% type.GetHashCode();" jako wartość zwracana dla GetHashCode() to dobry pomysł ... –