我在 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
的测试(后者应该初始化定位器),然后等待一分钟。在处理程序中,我跟踪当前的 ,除了在创建地理定位器后立即跟踪它。StatusChanged
PositionChanged
StatusChanged
LocationStatus
此LocationStatus
测试中 Geolocator 的 开始于NotInitialised
,并且从不改变。
现在我认为这是一个阻塞问题,与以下事实有关(引用GetGeopositionAsync
开头链接中的文档):
必须在 UI 线程上首次使用 Geolocator 对象调用 GetGeopositionAsync,以便向用户显示同意提示。有关详细信息,请参阅访问个人数据的设备指南。
所以我的猜测是:
- a) 调用是在 UI 线程上进行的(不太可能),但是因为没有 UI 表面(除了在调试 windows 存储单元测试时偶尔出现的奇怪的黑屏),UI 无法显示,所以调用永远不会完成。
- b)没有在 UI 线程上进行调用,因此无法显示 UI,因此调用永远不会完成。
无论哪种方式,我得出的结论是不可能Geolocator
在 Windows Store 单元测试中使用,因为我不可能同意我自己的单元测试来访问位置服务!同样让我感到沮丧的是,这样一个核心组件会因为无法显示 UI 而让自己无限期地运行——这太糟糕了。
有人不得不面对这个吗?能够对使用地理位置的代码进行单元测试真是太好了!