如何在Swift中模拟CLLocationManager

时间:2015-03-18 20:12:32

标签: ios swift mocking

我无法覆盖CLLocationManager的location属性。 关于如何做到的任何想法?

如果我这样做:

class MockCLLocationManager: CLLocationManager {
    var location {
        get {
            return CLLocation(latitude: 0, longitude: 0)
        }
    }
}

我收到错误:'@objc' getter for non-'@objc' property

谢谢。

2 个答案:

答案 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])