Ошибка Assert.AreEqual в модульном тесте - PullRequest
6 голосов
/ 03 марта 2011

У меня есть следующий модульный тест:

string MtrlCode = "0";
Assessment target = new Assessment(MtrlCode);

List<string> EdgeCaseSymbolCodes = new List<string>(); //More than 3
EdgeCaseSymbolCodes.Add("FLA");
EdgeCaseSymbolCodes.Add("HAR");
EdgeCaseSymbolCodes.Add("COR");
EdgeCaseSymbolCodes.Add("ENVON");
EdgeCaseSymbolCodes.Add("ENVR");
EdgeCaseSymbolCodes.Add("EXP");

target.HazardSymbols = EdgeCaseSymbolCodes;

List<string> EdgeCaseSymbolCodesExpected = new List<string>(); //Should be 3
EdgeCaseSymbolCodesExpected.Add("FLA");
EdgeCaseSymbolCodesExpected.Add("HAR");
EdgeCaseSymbolCodesExpected.Add("COR");

System.Windows.Forms.MessageBox.Show(EdgeCaseSymbolCodesExpected[0] + EdgeCaseSymbolCodesExpected[1] + EdgeCaseSymbolCodesExpected[2] + " = \n" + target.HazardSymbols[0] + target.HazardSymbols[1] + target.HazardSymbols[2]);

Assert.AreEqual<List<string>>(EdgeCaseSymbolCodesExpected, target.HazardSymbols, "COSHH_2008.Custom_Classes.Assessment.setHazardSymbols Edge Case did not return the expected value.");

, который тестирует граничный случай (время, когда List<string> имеет более 3 элементов) с желаемым выходом, являющимся возвращением только первого3.

В настоящее время тест не пройден, и мне пришлось прибегнуть к использованию MessageBox для просмотра внутри теста (из-за того, что точки останова не были достигнуты!).

Отя вижу, что элементы одинаковы, однако я понимаю, что с объектом List<string> может быть что-то другое, но я не вижу этого, поскольку точки останова никогда не были достигнуты.

Я могу 'найти окно модулей в Visual Studio 2005.

Какими будут ваши следующие шаги?

Ответы [ 10 ]

14 голосов
/ 16 апреля 2012

Использование CollectionAssert.AreEqual().

8 голосов
/ 03 марта 2011

Если Assert.Equals использует компаратор по умолчанию (понятия не имеет), этот тест не пройден, поскольку List<T> по умолчанию использует ссылочное равенство.

Если оба списка имеют одинаковый порядок, вы можете использовать метод расширения linq Enumerable.SequenceEqual для проверки на поэлементное равенство.

Если вы хотите считать списки с одинаковыми элементами равными даже при разном порядке, вы можете использовать a.Intersect(b).Count()==a.Unit(b).Count(), поскольку в Linq нет метода расширения SetEqual.


И даже если он сравнивается по значению, почему вы ожидаете, что список, содержащий 3 элемента, будет равен списку, содержащему 6 элементов?


Как примечание: ваши соглашения об именах отличаются от соглашений .net. Обычно имена локальных переменных начинаются со строчных букв.

И я нахожу строку target.HazardSymbols = EdgeCaseSymbolCodes; очень странной. Означает ли это, что у вас есть свойство типа List<T> с открытым сеттером? Я бы предпочел избегать тех, которые могут привести к тому, что разные объекты будут использовать один и тот же экземпляр List, что может иметь странные последствия, если они изменят свой список.

3 голосов
/ 03 марта 2011

Прежде всего, ваши списки не совпадают. У одного есть 3 элемента, а у другого 6, поэтому я не ожидал бы, что они будут равны в первую очередь.

Во-вторых, класс List сравнивается как равный, только если они представляют собой один и тот же список, а не просто списки с одинаковыми элементами. В вашем случае вы хотите использовать что-то вроде Assert(EdgeCaseSymbolCodesExpected.SequenceEqual(target.HazardSymbols), которое будет проходить через каждый элемент списка, сравнивая каждый на равенство.

3 голосов
/ 03 марта 2011

Я не думаю, что Assert.AreEqual поддерживает коллекции.

Вам придется написать собственный метод, который проверяет количество элементов в коллекциях и сравнивает их по отдельности.

Вы должны будете предоставить свою собственную логику для того, как вы определяете равенство коллекций , т.е. если обе коллекции содержат одинаковые элементы, но в разном порядке, равны ли они?

3 голосов
/ 03 марта 2011

Ссылки на списки разные, попробуйте вместо

Assert.AreEqual(EdgeCaseSymbolCodesExpected[0], target.HazardSymbols[0]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected[1], target.HazardSymbols[1]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected[2], target.HazardSymbols[2]);
1 голос
/ 21 июля 2014

Если вы хотите сравнить со списком, вы можете создать функцию void с этим фрагментом кода.

Assert.AreEqual(response.Count, acceptedResponse.Count,"Diferent list length");
            for (int i = 0; i < acceptedResponse.Count; i++)
            {
                Assert.AreEqual(response[i],acceptedResponse[i]);
            }
1 голос
/ 03 марта 2011

Сбой Assert, поскольку он проверяет, являются ли два списка на самом деле одним и тем же экземпляром. Они не; это два разных экземпляра списка. Вам нужно будет написать код, чтобы убедиться, что два списка содержат одинаковый набор элементов.

0 голосов
/ 03 марта 2011

Ваш фактический список, кажется, содержит больше элементов, чем ожидаемый список.Таким образом, они не равны.

0 голосов
/ 03 марта 2011

Я также столкнулся с той же проблемой. В качестве обходного пути вы можете проверить счетчик списка, сделать для каждого и проверить наличие.

0 голосов
/ 03 марта 2011

Это похоже на случай сравнения значений и сравнения. Если у вас есть два разных экземпляра объектов с одинаковыми значениями свойств, по умолчанию они никогда не будут «равными» при сравнении по умолчанию. Вы должны сравнить значения объектов. Попробуйте написать код, чтобы сравнить значения каждого экземпляра.

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