我无法覆盖CLLocationManager的location属性。 关于如何做到的任何想法?
如果我这样做:
class MockCLLocationManager: CLLocationManager {
var location {
get {
return CLLocation(latitude: 0, longitude: 0)
}
}
}
我收到错误:'@objc' getter for non-'@objc' property
谢谢。
答案 0 :(得分:9)
这可能是一个迟到的答案,但因为我也在寻找同样的事情:
您会使用相反的方法吗?首先声明一个在实际CLLocationManager
的情况下将使用的协议protocol LocationManager{
var location:CLLocation? {get}
}
使CLLocationManager符合它
extension CLLocationManager:LocationManager{}
这样您可以在测试中模拟位置管理器,如下所示:
class MockLocationManager:LocationManager{
var location:CLLocation? = CLLocation(latitude: 55.213448, longitude: 20.608194)
}
但也可以在生产代码中传递CLLocationManager而不是它。
在此处查看更多内容:https://blog.eliperkins.me/mocks-in-swift-via-protocols/
修改已修复的已损坏链接
答案 1 :(得分:2)
这对我有用:
fileprivate class MockLocationManager : CLLocationManager {
var mockLocation: CLLocation?
override var location: CLLocation? {
return mockLocation
}
override init() {
super.init()
}
}
并且在测试本身上,只需将一个clllocation分配给mockLocation
let locationManager = MockLocationManager()
locationManager.mockLocation = anyLocation
并测试你的内在逻辑,如:
yourClass.locationManager(locationManager, didUpdateLocations: [anyLocation])