MSUnit: Assert.AreEqual не работает с деревьями - PullRequest
0 голосов
/ 19 августа 2011

Я должен проверить равенство деревьев. Другими словами, объекты, которые содержат List<T> с дочерними элементами и дочерними элементами, также содержат List<T> с дочерними элементами и так далее.

Я обнаружил, что вы можете протестировать List с CollectionAssert, однако он не очень хорошо работает с композитами.

Есть предложения? MSUnit - моя тестовая библиотека.

Пример

IReagentComposed bronzeBarParsed = (from n in composedCrafts where n.ItemId == 2841 select n).Single();

IReagentComposed bronzeBar = new Craft()
{
    ItemId = 2841,
    Profession = Profession.Mining,
    Quantity = 0,
    QuantityCrafted = 0,
    Skill = 50,
    Reagents = new List()
    {
        new Craft()
        {
            ItemId = 2840,
            Quantity = 0,
            Skill = 1,
            Profession = Profession.Mining,
            Reagents = new List()
            {
                new Reagent()
                {
                    ItemId = 2770,
                    Quantity = 1
                }
            }
        },
        new Craft()
        {
            ItemId = 3576,
            Quantity = 0,
            Skill = 50,
            Profession = Profession.Mining,
            Reagents = new List()
            {
                new Reagent()
                {
                    ItemId = 2771,
                    Quantity = 1
                }
            }
        }
    }
};

Assert.AreEqual(bronzeBar, bronzeBarParsed);

Создание и реагент

public class Craft : IReagentComposed
{
    public int QuantityCrafted { get; set; }
    public int Quantity { get; set;}
    public int ItemId { get; set; }
    public int Skill { get; set; }
    public Profession Profession { get; set; }
    public IEnumerable Reagents { get; set; }


    public override bool Equals(object other)
    {
        if (other == null || GetType() != other.GetType()) return false;

        IReagentComposed o = other as IReagentComposed;

        return o != null && this.Quantity == o.Quantity &&
                this.ItemId == o.ItemId &&
                this.Profession == o.Profession &&
                this.Reagents == o.Reagents && //also tried Equals
                this.Skill == o.Skill;
    }

    public override int GetHashCode()
    {
        return 0;
    }
}

public class Reagent : IReagent
{
    public int ItemId { get; set; }
    public int Quantity { get; set; }

    public override bool Equals(object other)
    {
        if (other == null || GetType() != other.GetType()) return false;

        IReagent o = other as IReagent;

        return o != null && o.ItemId == this.ItemId && o.Quantity == this.Quantity;
    }

    public override int GetHashCode()
    {
        return 0;
    }
}

Ответы [ 2 ]

2 голосов
/ 20 августа 2011
        return o != null && this.Quantity == o.Quantity &&
                this.ItemId == o.ItemId &&
                this.Profession == o.Profession &&
                this.Reagents == o.Reagents && //also tried Equals
                this.Skill == o.Skill;

Реагенты вряд ли совпадают, это разные объекты списка. List <> не переопределяет Equals, хотя не совсем понятно, какой тип вы используете. Напишите небольшую вспомогательную функцию, которая принимает два списка реагентов и проверяет равенство. Обычно вы начинаете со сравнения List <>. Count, а затем разбираете элементы по одному.

0 голосов
/ 20 августа 2011

Добавлен метод расширения для IEnumberable<T>:

public static class IEnumberableExtensions
{
    public static bool AreEnumerablesEqual<T>(this IEnumerable<T> x, IEnumerable<T> y)
    {
        if (x.Count() != y.Count()) return false;

        bool equals = false;

        foreach (var a in x)
        {
            foreach (var b in y)
            {
                if (a.Equals(b))
                {
                    equals = true;
                    break;
                }
            }

            if (!equals)
            {
                return false;
            }

            equals = false;
        }

        return true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...