Tengo una prueba de unidad para comprobar si un método devuelve el IEnumerable
correcto. El método crea el enumerable usando yield return
. La clase que se trata de un enumerable de es el siguiente:¿Cómo determina Assert.AreEqual la igualdad entre dos IEnumerables genéricos?
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;
}
}
Esta es la parte relevante del método:
foreach (var lookup in REGEX_MAPPING)
{
if (lookup.re.IsMatch(s))
{
yield return new Token { type = lookup.type, text = s };
break;
}
}
Si almaceno el resultado de este método en actual
, haga otra enumerables expected
, y compárelos así ...
Assert.AreEqual(expected, actual);
..., la aserción falla.
me escribió un método de extensión para IEnumerable
que es similar a Python's zip
function (que combina dos IEnumerables en un conjunto de pares) y probamos este:
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
Funcionó! Entonces, ¿cuál es la diferencia entre estos dos Assert.AreEqual
s?
@ Jason panadero: por favor no tomes a mal De esta manera, ¿has considerado que el hecho de que tengas que hacer una pregunta como esta podría significar que estás complicando las cosas? –
Erm ... no, en realidad no. :-) ¿Podrías dirigirme hacia donde estoy complicando las cosas? –
Además, no estoy convencido de que usar "text.GetHashCode()% type.GetHashCode();" como un valor de retorno para GetHashCode() es una buena idea ... –