Ho un test unitario per verificare se un metodo restituisce il valore corretto IEnumerable
. Il metodo crea l'enumerabile usando yield return
. La classe che si tratta di un enumerabile di è qui sotto:In che modo Assert.AreEqual determina l'uguaglianza tra due IEnumerables generici?
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;
}
}
Questa è la parte rilevante del metodo:
foreach (var lookup in REGEX_MAPPING)
{
if (lookup.re.IsMatch(s))
{
yield return new Token { type = lookup.type, text = s };
break;
}
}
Se devo conservare il risultato di questo metodo in actual
, fare un altro enumerabile expected
, e confrontali in questo modo ...
Assert.AreEqual(expected, actual);
..., l'asserzione fallisce.
Ho scritto un metodo di estensione per IEnumerable
che è simile a Python's zip
function (che combina due IEnumerables in una serie di coppie) e abbiamo provato questo:
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
Ha funzionato! Quindi qual è la differenza tra questi due Assert.AreEqual
s?
@ Jason Baker: si prega di non prendere questo il male modo, hai considerato che il fatto di dover fare una domanda come questa potrebbe significare che stai rendendo le cose troppo complicate? –
Ehm ... no, non proprio. :-) Potresti indicarmi dove sto complicando le cose? –
Inoltre, non sono convinto che l'utilizzo di "text.GetHashCode()% type.GetHashCode();" come valore di ritorno per GetHashCode() è una buona idea ... –