Тест загрузки MStest со списком <> возвращен не работает -- unit-testing поле с участием generics поле с участием mstest пол Связанный проблема

MSTest Unit Test with List<> returned not working


2
vote

проблема

русский

У меня довольно простая единица теста, который тестирует правильное поколение универсального <код> List<SelectListItem> .

 <код>     [TestMethod()] public void PopulateSelectListWithSeperateTextAndValueLists() {     //Arrange     SetupDisplayAndValueLists();     bool allOption = false;      //Act     List<SelectListItem> result = ControllerHelpers.PopulateSelectList(valueList, displayList, allOption);      //Assert     Assert.AreEqual(expected, result); }   

Assert всегда возвращает false, даже если я проверил и подтвердил, что оба объекта имеют одинаковые точные значения.

Есть ли какие-либо особые соображения при тестировании единицы возврата результатов, которые являются универсальными?

Обновлено новыми тестами и их статусом

 <код> Assert.AreEqual(4, result.Count); //passes  Assert.AreEqual(result[0].Text, expected[0].Text, "0 element is not found");//passes Assert.AreEqual(result[1].Text, expected[1].Text, "1 element is not found");//passes Assert.AreEqual(result[2].Text, expected[2].Text, "2 element is not found");//passes Assert.AreEqual(result[3].Text, expected[3].Text, "3 element is not found");//passes  Assert.AreEqual(result[0].Value, expected[0].Value, "0 element is not found");//passes Assert.AreEqual(result[1].Value, expected[1].Value, "1 element is not found");//passes Assert.AreEqual(result[2].Value, expected[2].Value, "2 element is not found");//passes Assert.AreEqual(result[3].Value, expected[3].Value, "3 element is not found");//passes  Assert.IsTrue(result.Contains(expected[0]), "0 element is not found"); //doesn't pass Assert.IsTrue(result.Contains(expected[1]), "1 element is not found"); //doesn't pass Assert.IsTrue(result.Contains(expected[2]), "2 element is not found"); //doesn't pass Assert.IsTrue(result.Contains(expected[3]), "3 element is not found"); //doesn't pass  Assert.AreEqual(expectedList, result); //doesn't pass   
Английский оригинал

I have a pretty simple unit test that is testing the proper generation of a generic List<SelectListItem> .

    [TestMethod()] public void PopulateSelectListWithSeperateTextAndValueLists() {     //Arrange     SetupDisplayAndValueLists();     bool allOption = false;      //Act     List<SelectListItem> result = ControllerHelpers.PopulateSelectList(valueList, displayList, allOption);      //Assert     Assert.AreEqual(expected, result); } 

The Assert always returns false, even though I have checked and confirmed that both objects have the same exact values.

Is there any special considerations when unit testing return results that are generics?

Updated with new tests and their status

Assert.AreEqual(4, result.Count); //passes  Assert.AreEqual(result[0].Text, expected[0].Text, "0 element is not found");//passes Assert.AreEqual(result[1].Text, expected[1].Text, "1 element is not found");//passes Assert.AreEqual(result[2].Text, expected[2].Text, "2 element is not found");//passes Assert.AreEqual(result[3].Text, expected[3].Text, "3 element is not found");//passes  Assert.AreEqual(result[0].Value, expected[0].Value, "0 element is not found");//passes Assert.AreEqual(result[1].Value, expected[1].Value, "1 element is not found");//passes Assert.AreEqual(result[2].Value, expected[2].Value, "2 element is not found");//passes Assert.AreEqual(result[3].Value, expected[3].Value, "3 element is not found");//passes  Assert.IsTrue(result.Contains(expected[0]), "0 element is not found"); //doesn't pass Assert.IsTrue(result.Contains(expected[1]), "1 element is not found"); //doesn't pass Assert.IsTrue(result.Contains(expected[2]), "2 element is not found"); //doesn't pass Assert.IsTrue(result.Contains(expected[3]), "3 element is not found"); //doesn't pass  Assert.AreEqual(expectedList, result); //doesn't pass 
</div
        

Список ответов

4
 
vote

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

Опять же, если элементы в вашей коллекции являются ссылочными типами, а не типы ценностей, это может сравнить их, как вы хотите. (Хотя строки будут работать нормально)

Обновление: поскольку вы сравниваете свойство этих элементов .text из этих элементов, вы можете попытаться использовать LINQ для возврата свойств текста в качестве коллекции. Затем CollectionsStert будет работать именно так, как вы хотите, чтобы сравнить фактические и ожидаемые коллекции текста.

 

Use the CollectionAssert class instead of the Assert class. You can choose to validate that items are in the same order, or just that they both have the same items overall.

Again though, if the items in your collection are reference types and not value types, it may not compare them how you want. (Though strings will work fine)

Update: Since you're comparing the .Text property of those items, you could try to use LINQ to return the Text properties as a collection. Then, CollectionAssert will work exactly as you want it for comparing the actual and expected collections of Text.

</div
 
 
   
   
0
 
vote
<Р> Вопрос здесь не может быть связано с дженериков, но делать с тем, что равенство 2 списков реализуется как. Равно () в списке может быть реализация объекта, проверка, если это тот же экземпляр только и не сравнивая содержимое. <Р> Когда мне нужно, чтобы проверить содержимое списка были заселены, как ожидается, с помощью C # и MBUnit, я, как правило, чтобы проверить счетчик равен, а затем проверить каждый элемент в списке. С другой стороны, если я не беспокоили о порядке элементов в списке результатов, можно проверить, содержит каждый.
 <код> Assert.AreEqual(3, result.Count); Assert.Contains(expectedList[0], result); Assert.Contains(expectedList[1], result); Assert.Contains(expectedList[2], result);   

Редактировать:

<Р> Похоже, SelectListItem использует <код> Object.Equals() реализацию и проверяет только ссылочное равенство (например, те же). Там в 2 решения, которые приходят на ум.
  1. Напишите метод, чтобы проверить список содержит элемент с заданным текстом и значением, а затем повторно использовать это. Это немного чище, но не очень так, если у вас нет больше тестов.

  2. С помощью заявления LINQ, чтобы выделить весь текст, и все значения, из списка результатов. Затем используйте Утверждает с CollectionEquivalentConstraints, чтобы проверить списки равны. (Примечание Я не проверял это сам, и я собираюсь покинуть онлайн-документации).

    <Р> вар тексты = result.Select (х = & GT; x.Text) .ToList ();
    Значения VAR = result.Select (х = & GT; x.Value) .ToList (); <Р> Assert.That (тексты, Is.EquivalentTo (новая строка [] {expectedList [0] .Text, expectedList [1] .Text, ...}); Assert.That (значения, Is.EquivalentTo (новая строка [] {expectedList [0] .Value, expectedList [1] .Value, ...});
<Р> Кроме того, можно упростить это значительно генерируя ваши ожидаемые значения, как 2 отдельных списков. Вы, вероятно, может также генерировать <код> Dictionary , а также обеспечить <код> Keys и <код> Values в качестве эквивалентных списков.
 

The issue here might not be related to generics, but to do with what the equality of 2 lists is implemented as. Equals() on a list may be the Object implementation, checking if it's the same instance only, and not comparing contents.

When I need to test the contents of a list have been populated as expected using C# and mbUnit, I tend to check the count is equal, and then check each item within the list. Alternately, if I'm not bothered about the order of the items in the results list, I can check it contains each.

Assert.AreEqual(3, result.Count); Assert.Contains(expectedList[0], result); Assert.Contains(expectedList[1], result); Assert.Contains(expectedList[2], result); 

Edit:

It looks like SelectListItem uses the Object.Equals() implementation, and only checks for referential equality (same instance). There's 2 solutions which come to mind.

  1. Write a method to check a list contains an item with a given text and value, then reuse that. It's a little cleaner, but not hugely so, unless you have more tests.

  2. Use linq statements to select all the text, and all the values, from the result list. Then use Asserts with CollectionEquivalentConstraints to check the lists are equal. (Note I haven't tested this myself, and am going off online documentation).

    var texts = result.Select(x => x.Text).ToList();
    var values = result.Select(x => x.Value).ToList();

    Assert.That(texts, Is.EquivalentTo(new string[] { expectedList[0].Text, expectedList[1].Text, ... }); Assert.That(values, Is.EquivalentTo(new string[] { expectedList[0].Value, expectedList[1].Value, ... });

You could also simplify this significantly by generating your expected values as 2 separate lists. You could likely also generate a Dictionary, and provide Keys and Values as the equivalent lists.

</div
 
 
   
   
0
 
vote
 <код> Dim i As Integer     Assert.AreEqual(expected.Count, actual.Count)      For i = 0 To expected.Count - 1         Assert.AreEqual(expected.ToList.Item(i).ID, actual.ToList.Item(i).ID)     Next   
<Р> В этом случае я сравниваю идентификаторы, я полагаю, вы могли бы сравнить любое поле ключевого значения типа и получить то же самое. Это прошло, в то время как ни один из методов CollectionAssert не сделал мне ничего хорошего. <Р> Лиза Морган
 
Dim i As Integer     Assert.AreEqual(expected.Count, actual.Count)      For i = 0 To expected.Count - 1         Assert.AreEqual(expected.ToList.Item(i).ID, actual.ToList.Item(i).ID)     Next 

In this case I am comparing the IDs, I suppose you could compare any value-type key field and get the same. This passed, while none of the CollectionAssert methods did me any good.

Lisa Morgan

</div
 
 

Связанный проблема

3  ClassnotfoundException с Junit при использовании класса. Формушка (..). GetInstance в то время как новые () работает нормально  ( Classnotfoundexception with junit when using class forname getinstance while ) 
Я получаю <код> ClassNotFoundException при запуске тестов с JUNIT: У меня есть куча тестов, которые тестируют класс основной. Основным классом имеет метод,...

1  Остановите ошибки Debug MSVC ++ от блокировки текущего процесса?  ( Stop msvc debug errors from blocking the current process ) 
Любые неудачные утверждения Assert в Windows приводят к появлению подразделения ниже и замораживают выполнение приложений. Я понимаю, что это ожидаемое поведе...

0  Проверьте плоский файл содержимого и формат в Java  ( Test flat file content and format in java ) 
Я должен отправить плоский файл во внешнюю систему. Содержание файла пример приведено ниже: <код> START 20150602 HEADER 100.00USD PRODUCT TEST1 ...

1  N Установление алфавитного заказа  ( N unit alphabetical order assertion ) 
У меня есть поле поиска на веб-сайте, который возвращает результаты поиска, на основе ключевого слова (хранение их в виде списка в C #) Есть параметры фильт...

1  Проблемы PHPUNIT Setup и PHP  ( Phpunit setup and php directory issues ) 
Я знаю, что это, вероятно, больше спрашивает, но я не использовал PHP в действительно долгое время, и я вновь борюсь со своим поведением пути и включает в себ...

2  Неспособность создавать «монгомаксиновую боб», когда тестирование единицы с FOGO  ( Failing to create mongomappingcontext bean when unit testing with fongo ) 
Я в настоящее время устанавливаю тест подразделения для проекта, на котором я работаю, и я бегаю в немного стены. Проект, на котором я работаю, использует Mon...

7  Ошибка тестирования блока - адаптер теста устройства не удалось подключиться к источнику данных или для чтения данных  ( Unit testing error the unit test adapter failed to connect to the data source ) 
Я использую VSTS 2K8, и я настроил модульный тестовый проект. В нем у меня есть тестовый класс с методом, который делает простое утверждение. Я использую элек...

0  CXXTESTESTGEN.PY бросить синтаксисную ошибку  ( Cxxtestgen py throw a syntax error ) 
Я следую по учебнику на Интеграция CXXTEST Visual Studio и я посмотрел на Google, но ничего не нашел. Когда я пытаюсь обедать базовый тест с CXXTEST и Vis...

4  Использование делегатов вместо интерфейсов для развязки. Хорошая идея?  ( Using delegates instead of interfaces for decoupling good idea ) 
При написании приложений GUI я использую класс верхнего уровня, который «Controls» или «координирует» приложение. Класс верхнего уровня будет нести ответствен...

0  C # Обработка исключений на класс  ( C sharp class wide exception handling ) 
Можно ли удалить исключения в одном месте в файле класса C #? Я кодирую некоторые модульные тесты в NUNIT для проверки веб-службы WCF, и на всех методах / т...

1  Затмение - не в состоянии запустить тесты Testng  ( Eclipse not able to run testng tests ) 
Я использую Eclipse kepler 4.3.2 и установил Testng Plug-in для него, но не могу запускать программу Testng, поскольку консоль Testng отображается ниже ошибки...

8  Установка тестирования с подделками или издевателями? [закрыто]  ( Unit testing with fakes or mocks ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

0  Агрегатное тестовое утверждение от конечного результата или проверки того, были ли параметры называются с помощью MOQ  ( Unit test assert against end result or verifying whether the parameters were cal ) 
Ниже приведен класс (Class1), который я хочу проверить, но я не полностью удовлетворен своим тестом монтажа. Пожалуйста, смотрите ниже образцы кода. Система...

1  Как использовать дженерики, содержащие частные типы с тестами визуальных студийных единиц  ( How to use generics containing private types with visual studio unit tests ) 
У меня есть проблема с классом, который я пытаюсь проверить. Я объявил частный Enum, и я использую это в общем словаре в коде. Этот Enum не имеет значения за ...

46  Охват кода тестирования подразделения - У вас есть 100% покрытие?  ( Unit testing code coverage do you have 100 coverage ) 
Произобрали ли тесты устройства 100% Code Coverage? Да или нет, а почему или почему нет. ...

Связанный проблема

3  ClassnotfoundException с Junit при использовании класса. Формушка (..). GetInstance в то время как новые () работает нормально 
1  Остановите ошибки Debug MSVC ++ от блокировки текущего процесса? 
0  Проверьте плоский файл содержимого и формат в Java 
1  N Установление алфавитного заказа 
1  Проблемы PHPUNIT Setup и PHP 
2  Неспособность создавать «монгомаксиновую боб», когда тестирование единицы с FOGO 
7  Ошибка тестирования блока - адаптер теста устройства не удалось подключиться к источнику данных или для чтения данных 
0  CXXTESTESTGEN.PY бросить синтаксисную ошибку 
4  Использование делегатов вместо интерфейсов для развязки. Хорошая идея? 
0  C # Обработка исключений на класс 
1  Затмение - не в состоянии запустить тесты Testng 
8  Установка тестирования с подделками или издевателями? [закрыто] 
0  Агрегатное тестовое утверждение от конечного результата или проверки того, были ли параметры называются с помощью MOQ 
1  Как использовать дженерики, содержащие частные типы с тестами визуальных студийных единиц 
46  Охват кода тестирования подразделения - У вас есть 100% покрытие?