我想在Swift中编写UI测试,在我们的应用程序中对Map的不同位置进行截图。为了做到这一点,我需要在测试期间模拟假GPS数据。
有一些解决方案像这样的一个(https://blackpixel.com/writing/2016/05/simulating-locations-with-xcode-revisited.html),使用GPX文件,并模拟Xcode中的Debug > Simulate Location
的位置,但我需要这是完全自动化的。理想的是类似于LocationManager
在Android中。
4条答案
按热度按时间eulz3vhy1#
我在编写UI测试时也遇到过类似的问题,因为模拟器/绑定设备不能做你想做的所有事情。我所做的是编写模仿所需行为的模拟(我通常无法控制的行为)。
用自定义位置管理器替换CLLocationManager将允许您完全控制位置更新,因为您可以通过CLLocationManagerDelegate方法以编程方式发送位置更新:
locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
.创建一个类
MyLocationManager
,使其成为CLLocationManager
的子类,并让它覆盖所有调用的方法。不要在被覆盖的方法中调用super,因为CLLocationManager实际上不应该接收方法调用。delegate
属性不需要被覆盖(也不能被覆盖),但您可以将其作为CLLocationManager的子类进行访问。若要使用
MyLocationManager
,您应该传入启动参数,以告知您的应用是否为UITest。在测试用例的setUp
方法中插入以下代码行:将CLLocationManager存储为在测试时为MyLocationManager的属性。在不测试时,将正常使用CLLocationManager。
hsvhsicv2#
为了进行(单元)测试,您可以混合
startUpdatingLocation
方法,以指示CLLocationManager
示例按照您希望的方式运行。下面是一个可能的实现:
当然,这只是
stopUpdatingLocation
的一个基本实现,还应该swizzled删除管理器。CLLocationMangager
的其他特性也可以在扩展中实现/swizzled。tsm1rwdh3#
不能。CLLocationManager正在代理的帮助下提供您的位置,您可以通过任何方式设置此位置。
您可以创建一个CLLocationManager模拟器类,它可以给予一些随时间变化的位置。或者您可以将您的测试与一个带有时间戳的GPX同步。
ffdz8vbo4#
另一个选择是将XCTest绑定到一个本地Web服务器,它将模拟位置,例如,通过idb。要了解更多细节,请随时查看这个blog post。希望它能有所帮助。