【发布时间】: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 的回答中指出的那样,我可以使用假货代替。
我还编写了另一个订阅GeoLocator 的StatusChanged 和PositionChanged 事件的测试(后者应该初始化定位器),然后等待一分钟。在StatusChanged 处理程序中,我追踪当前的LocationStatus,并在创建地理定位器后立即追踪它。
本次测试中Geolocator的LocationStatus从NotInitialised开始,永远不会改变。
现在我认为这是一个阻塞问题,与以下事实有关(引用开头链接中的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