3

我在 Windows Store 单元测试项目中有这个单元测试,使用Geolocator的 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 的回答中所指出的那样,我可以使用假货代替。

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

LocationStatus测试中 Geolocator 的 开始于NotInitialised,并且从不改变。

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

必须在 UI 线程上首次使用 Geolocator 对象调用 GetGeopositionAsync,以便向用户显示同意提示。有关详细信息,请参阅访问个人数据的设备指南

所以我的猜测是:

  • a) 调用在 UI 线程上进行的(不太可能),但是因为没有 UI 表面(除了在调试 windows 存储单元测试时偶尔出现的奇怪的黑屏),UI 无法显示,所以调用永远不会完成。
  • b)没有在 UI 线程上进行调用,因此无法显示 UI,因此调用永远不会完成。

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

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

4

2 回答 2

1

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

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

于 2012-11-30T18:30:46.087 回答
1

这是我发现的。

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

但是,一旦我在模拟器中运行代码,一切正常。

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

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

于 2013-01-17T08:12:17.143 回答