То, как обработать исключения, повысило в других потоках когда поблочное тестирование?

Если вы ищете способ переключаться между разными классами один за другим, а не все вместе, я быстро написал небольшой скрипт, который вы можете использовать:

https://github.com /ThibaultJanBeyer/.toggleClasses-for-jQuery

он расширяет новый метод jQuery .toggleClasses (), который делает именно то, что вы хотите. проверьте это и не стесняйтесь делать это лучше, если у вас есть улучшения :)

14
задан Raedwald 16 April 2018 в 15:41
поделиться

6 ответов

Вы можете попробовать установить AppDomain.CurrentDomain.UnhandledException и посмотреть, работает ли это? Я не знаю, как это взаимодействует с мыслью о тестовой оснастке VS

1
ответ дан 1 December 2019 в 16:49
поделиться

Обычно я стараюсь избегать запуска потоков в модульных тестах, внедряя поставщика потока, который во время модульных тестов фактически не предоставляет поток, а скорее выполняется синхронно.

Конечно, при таком подходе вы не можете протестировать какие-либо потенциальные конфликты или два реальных пути кода, работающих параллельно, но есть хороший аргумент, что такой тест на самом деле не является модульным тестом.

Когда вы это делаете проверьте два одновременных потока, затем вам понадобится поставщик потока, который перехватывает исключения в конце потока и сообщает о них как об ошибках.

0
ответ дан 1 December 2019 в 16:49
поделиться

Вы можете использовать обработчик Global Exception, чтобы перехватить все неперехваченные исключения в AppDomain:

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new EventHandler(UnhandledExceptionHandler);

Я думаю, что это будет работать и для исключений, генерируемых другими потоками

2
ответ дан 1 December 2019 в 16:49
поделиться

Пара идей:

  • Используйте BackgroundWorker для выполнения работы модульного тестирования. BackgroundWorker автоматически перехватывает необработанные исключения и сообщает о них в свойстве Error RunWorkerCompletedEventArgs. Однако вам понадобится способ заблокировать поток модульного тестирования, пока BackgroundWorker не завершит работу.
  • Сам по себе этот вариант не является хорошим и может даже не подходить для ваших целей тестирования. Тем не менее я хотел упомянуть. Вы можете вернуться к тому, как обрабатывались необработанные исключения из других потоков в .NET 1.0 и 1.1, используя legacyUnhandledExceptionPolicy . До .NET 2.0 необработанные исключения из потоков незаметно игнорировались. Однако в .NET 2.0 они фактически вызывают завершение работы приложения. Параметр legacyUnhandledExceptionPolicy позволяет иметь поведение до .NET 2.0.
0
ответ дан 1 December 2019 в 16:49
поделиться

Что я могу сказать из области C ++ (если знания могут быть переведены), так это то, что любое исключение, созданное в данном потоке, может быть поймано только в этом потоке . Если ваше основное приложение запускает три других потока, вы должны перехватывать исключения из каждого из (теперь 4) потоков независимо. Невозможно реализовать «глобальный» обработчик исключений в многопоточном коде. Это связано с тем, как потоки (и процессы) реализуются в ОС.

Но, как я уже сказал, я не знаю, насколько точно эта логика транслируется на C #, потому что она выполняется поверх виртуальной машины, такой как Java.

1112319]

0
ответ дан 1 December 2019 в 16:49
поделиться

Мне кажется, что наличие более одного потока в ваших тестах не очень похоже на единицу y . Есть ли что-нибудь в тестируемой логике, которая требует наличия нескольких потоков? Правда?

Или дело в том, что некоторые участники тестируемого кода оказываются многопоточными (например, сокет)? Если это так, вам действительно следует заменить этих соавторов какими-то тестовыми двойниками (моки, заглушки или что-то еще).

0
ответ дан 1 December 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: