Windows 应用商店应用单元测试 USB 设备

Posted

技术标签:

【中文标题】Windows 应用商店应用单元测试 USB 设备【英文标题】:Windows Store App Unit Testing a USB device 【发布时间】:2013-09-02 09:34:34 【问题描述】:

我正在为 Windows 应用商店应用程序编写一个 USB 设备 API,它使用 Windows 8.1 中的 Windows.Devices.USB API 来连接自定义 USB 设备并与之通信。我正在使用 Visual Studio 2013 开发预览 IDE。 库中的以下函数用于连接 USB 设备。 (为清楚起见进行了简化)

public static async Task<string> ConnectUSB()
    
        string deviceId = string.Empty;
        string result = UsbDevice.GetDeviceSelector(new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"));
        var myDevices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(result, null);
        if (myDevices.Count > 0)
        
            deviceId = myDevices[0].Id;
        
        UsbDevice usbDevice = null;
        try
        
            usbDevice = await UsbDevice.FromIdAsync(deviceId);
        
        catch (Exception)
        
            throw;
        
        if (usbDevice != null)
            return "Connected";
        return string.Empty;
    

当从 Windows Store App 项目中调用时,此函数可以完美地连接到设备。但是,当从 Windows Store Apps 项目的单元测试库中调用时,try 块中的语句会引发异常。

A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

从我所看到的情况来看,当调用 Async 函数而不使用 await 关键字时会发生这种情况。不过我用的是 await 关键字好吗!

更多信息,我无法使用 NUnit 为商店应用编写单元测试,所以我使用 MSTest 框架。

[TestClass]
public class UnitTest1

    [TestMethod]
    public async Task TestMethod1()
    
        await ConnectToUSB.ConnectUSB();
    

此外,我在两个 App Store 项目的清单文件中也包含了以下功能标记,没有这些标记,Store Apps 就无法连接到设备。

<m2:DeviceCapability Name="usb">      
  <m2:Device Id="vidpid:ZZZZ XXXX">
    <m2:Function Type="name:vendorSpecific" />
  </m2:Device>
</m2:DeviceCapability>

是我遗漏了什么还是 MSTest 框架中的错误?

【问题讨论】:

【参考方案1】:

我认为问题在于 等待 UsbDevice.FromIdAsync(deviceId); 必须在 UI 线程上调用,因为应用程序必须要求用户访问。

您必须使用 CoreDispatcher.RunAsync 以确保您在 UI 线程上或实际上在页面背后的代码中。

【讨论】:

谢谢,谢谢!现在我记得在示例代码中阅读过这个,但这个答案让我免于更多的痛苦。【参考方案2】:

我在 VS 2017 中遇到了与单元测试应用程序(通用 Windows)相同的问题。 我验证了我的前任 Greg Gorman 的回答(见下文)。我发现这是真的。 如果你在方法体内使用这个结构:

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
    Windows.UI.Core.CoreDispatcherPriority.Normal,
   async () =>
   
     ...
     UsbDevice usbDevice = await UsbDevice.FromIdAsync(deviceId);
     ...
   ).AsTask().Wait();

FromIDAsync 将按您的预期工作。

对于您的示例,将测试方法更改为:

[TestClass]
public class UnitTest1

  [TestMethod]
  public async Task TestMethod1()
  
    Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
      Windows.UI.Core.CoreDispatcherPriority.Normal,
     async () =>
     
       await ConnectToUSB.ConnectUSB();
     ).AsTask().Wait();
  

【讨论】:

以上是关于Windows 应用商店应用单元测试 USB 设备的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Windows 8.1 应用商店应用的蓝牙低功耗服装服务设备发现和开发

在 Windows 10 商店应用程序 c# 中获取设备的唯一 ID

在没有 USB 的真实设备上测试 android 应用程序

如何在发布到应用商店之前在设备上测试 ipa 应用(来自 expo)

如何在测试设备中同时维护调试和应用商店发布版本?

Windows 11运行Android应用得到保障,亚马逊应用商店将支持AAB