MSTest Unit Test со списком <> вернулся не работает - PullRequest
1 голос
/ 11 марта 2011

У меня довольно простой модульный тест, который проверяет правильность генерации универсального 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

Ответы [ 3 ]

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

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

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

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

0 голосов
/ 03 августа 2011
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 мне не помог.

Лиза Морган

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

Проблема здесь может быть связана не с обобщениями, а с тем, как реализовано равенство 2 списков.Equals () в списке может быть реализацией объекта, проверяя, является ли это только один и тот же экземпляр, и не сравнивая содержимое.

Когда мне нужно проверить содержимое списка, оно заполняется, как и ожидалось, с использованием 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() и проверяет только равенство ссылок (тот же экземпляр).На ум приходят два решения:

  1. Напишите метод проверки списка, содержащий элемент с заданным текстом и значением, а затем используйте его повторно.Это немного чище, но не так сильно, если у вас нет дополнительных тестов.

  2. Используйте операторы linq, чтобы выделить весь текст и все значения из списка результатов.Затем используйте Asserts с CollectionEquivalentConstraints, чтобы проверить, что списки равны. (Обратите внимание, что я не проверял это сам и отключаю онлайн-документацию.)1023 * var values ​​= result.Select (x => x.Value) .ToList ();

    Assert.That (тексты, Is.EquivalentTo (новая строка [] {Ожидаемый список [0]. Текст, Ожидаемый список [1]. Текст, ...}); Assert.That (значения, Is.EquivalentTo(новая строка [] {Ожидаемый список [0]. Значение, ожидаемый список [1]. Значение, ...});

Вы также можете значительно упростить это, создав ожидаемые значения как2 отдельных списка. Вы также можете сгенерировать Dictionary и предоставить Keys и Values в качестве эквивалентных списков.

...