Почему мой проект MSTest только перехватывает это исключение, когда "Debug" d, а не "Run" d? - PullRequest
0 голосов
/ 27 февраля 2019

Я пишу код в стиле TDD с помощью MSTest, для Windows 10 Bluetooth Low Energy API.У меня есть обратный вызов, который вызывается операционной системой при обнаружении периферийного устройства BLE во время сканирования.

void StartScan()
{
    _BleWatcher = new BluetoothLEAdvertisementWatcher();
    _BleWatcher.Received += ScanDiscovery;
    _BleWatcher.Start();
}

// this usually fires in under a second, and always in under ten seconds
void ScanDiscovery(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs bleAdvert)
{
    Debug.WriteLine("This handler was indeed called.");
    throw new Exception();
}

Если во время обратного вызова возникает «Выполнить выбранный тест» и возникает исключение, оно явно не обнаруживаетсязапущенный процесс.Тест проходит, и исключение не мешает тестируемому устройству нормально работать.

[TestMethod]
async Task ScanTest()
{
    StartScan();
    await Task.Delay(10000);
    // this always completes, even though I see the debug message in the Output
}

Однако, если я "Отладить выбранный тест", Visual Studio предупреждает меня об ожидаемом исключении!

Есть ли что-то «другое» в том, как API Windows, такой как BluetoothLEAdtactWatcher.Received будет определять, как исключения маршрутизируются и перехватываются процессом?

Проект ориентирован на .NET Standard2.0, используя этот трюк для доступа к API-интерфейсам UWP.

1 Ответ

0 голосов
/ 05 марта 2019

Событие ScanDiscovery не вызывается в вашем потоке.Он вызывается потоком, созданным вызовом _BleWatcher.Start ().Поскольку он не работает в том же потоке, что и ScanTest (), вы не можете перехватить там исключение.

В режиме отладки Visual Studio остановится при возникновении исключения независимо от того, в каком потоке он запущен.

Вам нужно будет перехватить исключение внутри ScanDiscovery или посмотреть что-то вроде AppDomain.UnhandledException.

...