私はメソッドが正しいIEnumerable
を返すかどうかをチェックするユニットテストを持っています。このメソッドは、yield return
を使用して列挙型を作成します。それはの可算であるというクラスは以下の通りです:Assert.AreEqualは、2つの汎用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;
}
}
これは方法の関連する部分である:
foreach (var lookup in REGEX_MAPPING)
{
if (lookup.re.IsMatch(s))
{
yield return new Token { type = lookup.type, text = s };
break;
}
}
私はactual
にこのメソッドの結果を保存する場合は、別の列挙expected
を行い、このように比較してください。
Assert.AreEqual(expected, actual);
...アサーションが失敗します。
私は(それはペアのセットに2 IEnumerablesを兼ね備え)Python's zip
functionに似てIEnumerable
ための拡張メソッドを書いて、この試みた:それは働いた
foreach(Token[] t in expected.zip(actual))
{
Assert.AreEqual(t[0], t[1]);
}
を!では、これら2つの違いは何ですか?Assert.AreEqual
?
@Jasonベイカー:あなたは(順番は関係ありません)等価性をテストするために
AreEquivalent
を使用している場合;-)は、エラーメッセージは、より便利取得この間違ったを服用しないでくださいあなたは、このような質問をしなければならないという事実は、あなたが物事を複雑にしていることを意味するかもしれないと考えましたか? –
Erm ...いいえ、実際にはありません。私が物事を複雑にしているところに向かって私を指摘できますか? –
また、私は "text.GetHashCode()%type.GetHashCode();"を使用すると確信していません。 GetHashCode()の戻り値としては良い考えです... –