|
7 / 7 / 1
Регистрация: 24.01.2017
Сообщений: 229
|
|
Юнит тесты для MVVM архитектуры13.06.2017, 10:50. Показов 2097. Ответов 5
Метки нет (Все метки)
Столкнулся с такой проблемой: есть несколько абстрактных базовых классов вьюмоделей (для простого объекта, коллекции и дерева). У них один общий базовый класс ViewModel. Вьюмодели поддерживают отмену/сохранение/обновление своих данных. При использовании в коде можно создавать целые графы зависимостей одних вьюмоделей от других, т.е., например, на форме есть дерево, каждый элемент дерева содержит список элементов, которые при выборе узла дерева отображаются в определенном месте формы, каждый элемент этой коллекции может состоять из набора различных достаточно больших объектов (для которых нужны свои вьюмодели), в зависимости от типа.
Начал писать тесты для базовых вьюмоделей и столкнулся с такой проблемой, что мои тесты очень простые и всегда проходят, но для каких-нибудь сложных сценариев взаимодействия между вьюмоделями могут возникать ошибки (не все изменения в графе отменились, где-то упало и часть изменений отменить потом не удается, сохранение в некоторых случаях записывает не все данные в базу и т.д.). Как правильно писать тесты нигде не нашел. Везде рекомендации общего плана, типа тестируйте одно действие за один раз, а что делать, если к ошибке может привести не каждое действие в отдельности, а их комбинация?
0
|
|
| 13.06.2017, 10:50 | |
|
Ответы с готовыми решениями:
5
Юнит-тесты для C++ Написать юнит-тесты и реализовать функцию для матрицы
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 17.06.2017, 18:08 | |
|
0
|
|
|
7 / 7 / 1
Регистрация: 24.01.2017
Сообщений: 229
|
|
| 19.06.2017, 08:49 [ТС] | |
|
Не очень понял как mock помогает решить эту проблему.
Допустим в моей вьюмодели есть свойство IsEmpty, которое проверяет, что все её свойства заполнены значениями по умолчанию. Тогда: 1) если мы изменяем какое-нибудь свойство - IsEmpty == false; 2) если изменяем какое-нибудь свойство и делаем отмену - IsEmpty == true; 3) если изменяем какое-нибудь свойство и сохраняем - IsEmpty == true; 4) если изменяем какое-нибудь свойство, сохраняем и пробуем отменить - IsEmpty == false; 5) если изменяем какое-нибудь свойство и обновляем вьюмодель - IsEmpty == true; Это простой пример. Угадать все цепочки возможных действий нереально. Но уже видно, что отмена во втором случае и в четвертом приводит к разному значению IsEmpty. Теперь придуманный пример: есть некоторая реализация списка на основе массива. 1) Тестируем добавление элемента - тест проходит. 2) Тестируем удаление элемента - тест проходит. В релизе программы встретился код: list.Add(item); list.Remove(item); list.Add(item); - программа упала (хотя тесты проходили). При отладке выяснилось, что в методе удаления не происходил декремент индекса и последующий Add привел к выходу индекса за границы массива. Это грубый пример и такая ошибка скорее всего не доживет до продакшена, но он демонстрирует, что простая невнимательность может привести к подобным неочевидным ошибкам, хотя тесты будут успешно проходить. Однако, данная ошибка не произойдет, если Add добавляет элемент, но в массиве еще достаточно места: list.Add(item); list.Remove(item); list.Add(item); - сработает, но в массиве будет "дырка" вместо элемента, которая может спровоцировать совсем другие ошибки. Возможно я еще не разобрался как правильно писать тесты, но хочу это сделать.
0
|
|
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
||
| 19.06.2017, 12:24 | ||
|
То есть, нам недостаточно того, чтобы метод Сложение отработал без ошибок - нам нужно ещё, чтобы он правильную сумму вернул.
0
|
||
|
7 / 7 / 1
Регистрация: 24.01.2017
Сообщений: 229
|
||
| 19.06.2017, 13:08 [ТС] | ||
|
Метод Remove возвращает true, если элемент был удален. Мы можем проверить отсутствие элемента с помощью метода Contains. Тут тоже всё в порядке. Однако программа упадет, т.к. нет декремента индекса у внутреннего массива.
0
|
||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
||
| 19.06.2017, 15:29 | ||
|
Добавлено через 58 секунд Это общий недостаток "объектов с состоянием". Чем меньше у вас таких объектов, тем проще и надёжней программы.
0
|
||
| 19.06.2017, 15:29 | |
|
Помогаю со студенческими работами здесь
6
Юнит-тесты Юнит тесты Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|