0

これは単体テストの最初の試みです。私の.Equalsメソッドは で失敗していTestSet_Equals_TrueますTestSet_Equals_True_Shuffled_Order。これが HOW I 単体テストの問題なのか、それとも私の.Equals方法に何か問題があるのか​​ についての明確化を期待しています。

単体テスト:

private void Populate(Set set, int count)
{
    for (int i = 0; i < count; ++i)
        set.Add(i);
}

[TestMethod]
public void TestSet_Equals_True()
{
    Set set1 = new Set();
    Set set2 = new Set();

    Populate(set1, POPULATE_COUNT);
    Populate(set2, POPULATE_COUNT);
    bool expected = true;
    bool actual = set1.Equals(set2);
    Assert.AreEqual(expected, actual);
}

クラス:

List<object> _set;

//Override Equals
public override bool Equals(object obj)
{
if (this.GetType() != obj.GetType())
    return false;
Set o = (Set)obj;

if (this._set.Count != o._set.Count)
    return false;

o._set.Sort();
this._set.Sort();

return _set.Equals(o._set); }
4

3 に答える 3

3

List<T>Equals の実装はobject.Equals- Reference Equality のデフォルトの実装です。

2 つIEnumerable<T>が等しいかどうかを確認するには、拡張メソッドを使用できます-名前空間のステートメントIEnumerable<T>.SequenceEqualsを追加することを忘れないでください。usingSystem.Linq

幸運を。

于 2013-01-19T19:39:03.477 に答える
1

まず、 equal メソッド内でセットをソートしないでください。はEquals、オブジェクトを変更するべきではありません。2 つのオブジェクトが同一かどうかのみを判断する必要があります。

を使用できますSequenceEqualsが、 をSequenceEquals処理しないことに注意してくださいNullReferenceExceptions

したがって、問題は Equals の実装にあると思います。たぶん、次のようなことを試すことができます:

    public override bool Equals(object obj)
    {
        var isEqual = false;

        var otherSet = obj as Set;

        if (otherSet != null)
        {
            isEqual = _set.Count == otherSet.Count;
            isEqual &= _set.SequenceEqual(otherSet);
        }

        return isEqual;
    }
于 2013-01-19T19:44:55.533 に答える
0

Sortで通話を削除できますEquals。それらがどのような目的に役立つのかわかりませんEquals。実装するべきではありません。ListEqualsは等価を参照するだけです。SequenceEquals拡張メソッドを使用して、IEnumerable<T>ここで等しいかどうかを確認できます。

var a = new List<int> {1, 2};
var b = new List<int> {1, 2};

Assert.False(a.Equals(b));
Assert.True(a.SequenceEqual(b));
于 2013-01-19T19:43:20.280 に答える