#c# #linq #unit-testing
#c# #linq #модульное тестирование
Вопрос:
Я тестирую метод, который манипулирует коллекцией. Учитывая набор параметров, он должен содержать ровно один элемент, соответствующий условию. Редактировать: в коллекции также может быть несколько других элементов, не соответствующих условию.
Я использую Single для тестирования этого поведения, которое работает нормально, поскольку оно не пройдет тест, вызвав исключение, если совпадений вообще нет или более одного совпадения. Но фактического утверждения нет, что каким-то образом нарушает rrange , ct, ssert . Поэтому мне интересно, является ли это плохой практикой и есть ли лучший способ сделать это.
Следующий псевдокод для демонстрации моего вопроса:
[TestMethod]
public void TestMethod()
{
List list = MethodToTest(param1, param2);
list.Single(s => s.Matches(condition));
//No actual Assert
}
Комментарии:
1. Я думаю, что assert лучше, хотя бы потому, что вы можете предоставить более информативное сообщение о том, что и где не удалось.
2. Это вопрос, основанный на мнении… На мой взгляд, я бы не стал использовать
Single
для проверки того, что в UTs есть только 1 элемент… Я бы использовалAssert.Equal(1,list.Count(...))
3. @Jon, который все равно будет выбрасываться, когда будет более одного результата.
4. На мой взгляд, это нечитабельно. Если бы я читал набор тестов, чтобы понять, что происходит, я бы остановился на несколько секунд, чтобы понять, чего вы пытаетесь достичь. Тесты должны быть легко читаемыми, никаких сюрпризов.
5. Вероятно, утверждение
list.Count(s => s.Matches(condition)) == 1
было бы лучше.
Ответ №1:
Мне интересно, является ли это плохой практикой и есть ли лучший способ сделать это.
Да и да.
он не пройдет тест, выдав исключение, если совпадений вообще нет или более одного совпадения.
Не проваливайте тест, выдавая исключение. Провалите тест, не пройдя тест. В вашей тестовой среде есть механизм для утверждения условия, проверяемого тестом. Вы купили этот тестовый фреймворк, и теперь вы сопротивляетесь использованию его функций. Используйте тестовый фреймворк так, как он был разработан для использования, или, если он вам не нравится, откажитесь от него и выберите фреймворк, который вам больше нравится. Но не выполняйте конечные прогоны вокруг его механизмов.
Неожиданные исключения не обязательно являются сбоями теста; они могут быть ошибочными тестами. Вы должны быть в состоянии определить разницу. Вы говорите так: если исключение возникает в тестируемом коде, это ошибка в коде. Если это происходит в тестовом коде, это ошибка в тесте. И теперь вы идете и обнаруживаете ошибку в тестируемом коде, вызывая выброс тестируемого кода. И теперь сложнее определить, где ошибка. Не заставляйте себя в будущем думать об этом; не пишите неожиданный код, который намеренно избегает условностей платформы тестирования.
Комментарии:
1. Спасибо за ваш ответ. Вы правы, я не думал о разнице между неудачным тестом и тестом с ошибками.