我使用Geolocator的GetGeopositionAsync过载在Windows单元测试项目中进行了这个单元测试:
[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的答案中所指出的,我可以使用一个假的。
我还编写了另一个测试,它订阅了GeoLocator的StatusChanged和PositionChanged事件(后者应该初始化定位器),然后等待一分钟。在StatusChanged处理程序中,我跟踪当前的LocationStatus,并且在创建了Geolocator之后立即跟踪它。
在这个测试中,地理坐标的LocationStatus从NotInitialised开始,永远不会改变。
现在,我认为这是一个阻塞问题,这与以下事实有关:(引用链接中的GetGeopositionAsync文档):
必须在UI线程上首次使用Geolocator对象来调用GetGeopositionAsync,这样才能向用户显示同意提示符。有关更多信息,请参见访问个人数据的设备指南。
所以我的猜测是:
不管怎样,我得出的结论是,在Windows单元测试中不可能使用Geolocator,因为我不可能为自己的单元测试提供访问位置服务的同意!同样,我感到沮丧的是,这样一个核心组件仅仅因为UI不能显示就允许自己无限期地运行--这太糟糕了。
有人要面对这一切吗?能够使用Geo-location的单元测试代码确实会很好!
发布于 2013-01-17 08:12:17
这是我发现的。
在我的桌面上(在企业代理后面),Geolocator从未完成初始化。因此,没有一个应用程序可以使用我目前的位置任何东西-它不只是限于单元测试。
不过,一旦我在模拟器中运行了代码,它就能正常工作。
我相信这最终与我的桌面没有安装位置提供商这一事实有关,因为它没有GPS接收器。我发现绝对令人难以置信的是,没有设备使用网络位置的后备位置提供商,或者,如果有,它在企业代理中不起作用。
无论是哪种方式,按照目前的情况,都不可能在我的桌面上(在单元测试或应用程序本身中)测试/调试任何需要从Geolocator类中定位的代码。哦,除了测试我的处理,它永远不会回来的情况!
发布于 2012-11-30 18:30:46
您不应该对库调用进行单元测试。单元测试应该只测试自己的逻辑。
然后,您可以通过提供一个模拟的Geolocator对象来完全避免这个问题,因为它不会有UI同意弹出对话框或超时延迟。
https://stackoverflow.com/questions/13644185
复制相似问题