6

私は現在、単体テストの使用方法を学ぼうとしており、3 つの動物オブジェクトの実際のリストと 3 つの動物オブジェクトの予想されるリストを作成しました。問題は、リストが等しいことを確認するためにどのようにアサートするかです。CollectionAssert.AreEqual と Assert.AreEqual を試しましたが、役に立ちませんでした。どんな助けでも大歓迎です。

テスト方法:

  [TestMethod]
    public void createAnimalsTest2()
    {
        animalHandler animalHandler = new animalHandler();
        // arrange
        List<Animal> expected = new List<Animal>();
        Animal dog = new Dog("",0);
        Animal cat = new Cat("",0);
        Animal mouse = new Mouse("",0);
        expected.Add(dog);
        expected.Add(cat);
        expected.Add(mouse);
        //actual
        List<Animal> actual = animalHandler.createAnimals("","","",0,0,0);


        //assert
        //this is the line that does not evaluate as true
        Assert.Equals(expected ,actual);

    }
4

4 に答える 4

10

リストは同じように見えるかもしれませんが、同じデータを含む 2 つの異なるオブジェクトです。

リストを比較するには、CollectionAssertを使用する必要があります

CollectionAssert.AreEqual(expected, actual);

これでうまくいくはずです。

于 2013-10-24T10:05:39.550 に答える
7

将来誰かがこれに出くわした場合に備えて、答えは、以下で説明するようにオーバーライド、IEqualityComparer を作成する必要があったということでした。

public class MyPersonEqualityComparer : IEqualityComparer<MyPerson>
{
public bool Equals(MyPerson x, MyPerson y)
{
    if (object.ReferenceEquals(x, y)) return true;

    if (object.ReferenceEquals(x, null)||object.ReferenceEquals(y, null)) return false;

    return x.Name == y.Name && x.Age == y.Age;
}

public int GetHashCode(MyPerson obj)
{
    if (object.ReferenceEquals(obj, null)) return 0;

    int hashCodeName = obj.Name == null ? 0 : obj.Name.GetHashCode();
    int hasCodeAge = obj.Age.GetHashCode();

    return hashCodeName ^ hasCodeAge;
}

}

于 2013-11-28T15:42:22.997 に答える
0

メソッド AssertListEquals() を変更し、標準の Assert.All() を使用しました

    public static void AssertListEquals<TE, TA>(IEnumerable<TE> expected, IEnumerable<TA> actual, Action<TE, TA> asserter)
    {
        if (expected == null && actual == null) return;
        Assert.NotNull(expected);
        Assert.NotNull(actual);

        Assert.True(
            actual.Count() == expected.Count(),
            $"Lists have different sizes. Expected list: {expected.Count()}, actual list: {actual.Count()}");

        var i = 0;
        Assert.All(expected, e =>
        {
            try
            {
                asserter(e, actual.Skip(i).First());
            }
            finally
            {
                i++;
            }
        });
    }
于 2022-02-08T11:18:09.943 に答える