为什么我的MSTest项目仅在“调试” d而不是“运行” d时捕获此异常?

时间:2019-02-26 22:49:04

标签: c# visual-studio unit-testing uwp mstest

我正在围绕Windows 10蓝牙低功耗API用MSTest编写一些TDD风格的代码。我有一个在扫描过程中发现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会按预期警告我该异常!

诸如BluetoothLEAdvertisementWatcher.Received之类的Windows API如何确定进程如何路由和捕获异常是否存在“差异”?

该项目针对.NET Standard 2.0,使用this trick访问UWP API。

1 个答案:

答案 0 :(得分:0)

没有在您的线程上引发ScanDiscovery事件。它是通过调用_BleWatcher.Start()创建的线程引发的。由于它不在与ScanTest()相同的线程上运行,因此您无法在那里捕获异常。

在调试模式下,无论在哪个线程上运行,都将在引发异常时Visual Studio停止。

您需要在ScanDiscovery内捕获异常,或查看类似AppDomain.UnhandledException的内容。