【问题标题】:Use Windows.Devices.Geolocation.Geolocator in a Windows Store unit test在 Windows 应用商店单元测试中使用 Windows.Devices.Geolocation.Geolocator
【发布时间】:2013-01-17 16:12:17
【问题描述】:

我在 Windows 应用商店单元测试项目中使用地理定位器的this overload of GetGeopositionAsync 进行了这个单元测试:

[TestMethod]
public async Task TestFunc()
{
  var locator = new Windows.Devices.Geolocation.Geolocator();

  var l = await 
          locator.GetGeopositionAsync(TimeSpan.MaxValue, TimeSpan.FromSeconds(10));

  Assert.IsNotNull(l);
}

但是这个测试不仅没有通过,而且在 10 秒后也没有退出 - 它永远不会完成(我等了 10 分钟才杀死它)。

我要强调的是,这是我真正想要运行的测试的配对版本——我不只是想对 Windows 进行单元测试;正如 John Deters 的回答中指出的那样,我可以使用假货代替。

我还编写了另一个订阅GeoLocatorStatusChangedPositionChanged 事件的测试(后者应该初始化定位器),然后等待一分钟。在StatusChanged 处理程序中,我追踪当前的LocationStatus,并在创建地理定位器后立即追踪它。

本次测试中Geolocator的LocationStatusNotInitialised开始,永远不会改变。

现在我认为这是一个阻塞问题,与以下事实有关(引用开头链接中的GetGeopositionAsync 文档):

必须在 UI 线程上首次使用 Geolocator 对象调用 GetGeopositionAsync,以便向用户显示同意提示。如需更多信息,请参阅Guidelines for devices that access personal data

所以我的猜测是:

  • a) 调用 是在 UI 线程上进行的(不太可能),但因为没有 UI 表面(除了在调试windows 存储单元测试),UI 无法显示,因此调用永远不会完成。
  • b) 调用没有在 UI 线程上进行,因此无法显示任何 UI,因此调用永远不会完成。

无论哪种方式,我得出的结论是不可能在 Windows 应用商店单元测试中使用 Geolocator,因为我不可能同意我自己的单元测试来访问位置服务!同样让我感到沮丧的是,这样一个核心组件会因为无法显示 UI 而让自己无限期地运行——这太糟糕了。

有人不得不面对这个吗?能够对使用地理位置的代码进行单元测试真是太好了!

【问题讨论】:

  • 未在 UI 线程上进行调用。无论如何,您将无法在单元测试中给予同意。
  • 是的,就像我想的那样。不过这很愚蠢:如果核心平台组件在首次使用时需要 UI 交互,那么应该在自动化测试场景中为此做出规定。我认为这是一个巨大的投球。
  • 我的应用程序中实际上也有这个错误。这不仅仅是一个单元测试问题。我还不确定为什么,但它似乎有时会突然停止工作。

标签: c# unit-testing windows-store-apps


【解决方案1】:

您不应该对库调用进行单元测试。你的单元测试应该只测试你自己的逻辑。

那么您可以通过提供一个模拟 Geolocator 对象来完全避免这个问题,因为它不会有 UI 同意弹出对话框或超时延迟。

【讨论】:

  • 我想这是一个合理的观点。有趣的是,我在应用程序中也遇到了相同的行为,其他商店应用程序也无法获取我的位置。在公司环境中,我想我可能需要调查组策略...
【解决方案2】:

这是我发现的。

在我的桌面上(在公司代理之后),地理定位器从不完成初始化。因此,没有任何应用可以将我当前的位置用于任何事情 - 它不仅限于单元测试。

不过,只要我在模拟器中运行代码,一切正常。

我相信这最终与我的桌面没有安装位置提供程序有关 - 因为它没有 GPS 接收器。我发现绝对令人难以置信的是,没有备用位置提供程序供设备使用网络位置,或者,如果有,它在公司代理后面不起作用。

无论哪种方式,就目前而言,无法在我的桌面(在单元测试中或在应用程序本身中)测试/调试任何需要来自 Geolocator 类的位置的代码。哦,除了测试我对它永远不会返回的情况的处理!

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    相关资源
    最近更新 更多