Есть ли способ, как продолжить после Debug.Assert () из кода? - PullRequest
4 голосов
/ 03 февраля 2011

Мой код работает с данными, которые «должны» быть правильными. Однако во время разработки бывают случаи, когда я получаю неверные данные.
Когда это происходит, я хотел бы поднять отладочное утверждение и, если пользователь решит продолжить, код отфильтрует недействительные записи и продолжит работу с «безопасными» данными.

// assert incorrect data
Debug.Assert(person.Items.All(item => item.IsValid), "Inconsistent data!");

// operate on filtered data
this.ItemViewModels = new ObservableCollection<ItemViewModel>(
                             person.Items
                                   .Where(i =>item.IsValid) // Use only correct data
                                   .Select(i => new ItemViewModel(lang, i)));

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

Вопрос: Есть ли способ пройти вызов assert в модульном тесте?
Какой-то эквивалент нажатия OK=Continue в диалоге «Ошибка подтверждения»?

ТИА

Ответы [ 2 ]

10 голосов
/ 03 февраля 2011

В дополнение к ответу SLaks я бы добавил, что то, что вы хотите сделать, является логически несовместимым.Утверждение должно использоваться для документирования условия, которое не может быть ложным. Если когда-либо возникает ложное условие, вы знаете, что у вас есть ошибка;цель утверждения - (1) как своего рода комментарий, который описывает читателя, что должно быть правдой на данном этапе в коде, и (2) средство отладки, которое сообщает вам, когда у вас есть ошибка.

Так как правильные утверждения в правильном коде никогда не стреляют, нет способа проверить срабатывание подтверждения .Предпосылка теста состоит в том, что он производит возможную конфигурацию вашего программного обеспечения и проверяет его правильность;но правильный код с правильными утверждениями никогда не имеет конфигурации, в которой срабатывает утверждение.

Похоже, вы используете Assert не для документирования того, что вы знаете, верно, носкорее то, на что вы надеетесь - это правда или обычно правда.Не используйте для этого утверждения.Если в программе есть какие-либо входные данные, которые приводят к нарушению утверждения, то вам нужно либо удалить утверждение, либо вызвать исключение, когда вы получаете недопустимые данные, чтобы утверждение никогда не увидело их.Утверждения предназначены для документирования того, что должно быть истинным , а не тем, что является правдой большую часть времени.

См. Также этот связанный вопрос:

Debug.Assert vsИсключение

6 голосов
/ 03 февраля 2011

Вы не должны использовать Debug.Assert для этого.
Debug.Assert предназначен для использования только в качестве средства отладки.
Он вообще не будет компилироваться в режиме Release.

Вместо этого вы должны создать свой собственный метод, который покажет пользователю более простое диалоговое окно, и его можно настроить так, чтобы он всегда продолжал модульное тестирование. (например, используйте свойство public static bool ShowWarnings)

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