Comment faire Valoir.AreEqual déterminer l'égalité entre les deux génériques IEnumerables?

J'ai une unité de test pour vérifier si une méthode retourne le bon IEnumerable. La méthode s'appuie l'énumérable à l'aide de yield return. La classe qu'il est une énumération 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 dans actual, faire un autre énumérable expected, et de les comparer comme ça...

  Assert.AreEqual(expected, actual);

..., l'assertion échoue.

J'ai écrit une méthode d'extension pour IEnumerable qui est similaire à Python zip function (il combine deux IEnumerables dans un ensemble de paires) et essayé ceci:

foreach(Token[] t in expected.zip(actual))
{
    Assert.AreEqual(t[0], t[1]);
}

Il a travaillé! Quelle est donc la différence entre ces deux Assert.AreEquals?

  • Baker: merci de ne pas mal le prendre, avez-vous considéré que le fait d'avoir poser une question comme celle-ci, pourrait signifier que vous faire des choses trop compliquées?
  • Hum... non, pas vraiment. 🙂 Pourriez-vous m'indiquer vers où je suis en train de faire des choses compliquées?
  • Aussi, je ne suis pas convaincu que l'utilisation de texte".GetHashCode() % type.GetHashCode();" comme une valeur de retour pour GetHashCode() est une bonne idée...
  • Blé - je ne suis pas sûr non plus... mais c'est le sujet d'une autre question.
InformationsquelleAutor Jason Baker | 2009-06-01