如何在Swift中模拟CLLocationManager

Rod*_*uiz 5 mocking ios swift

我无法覆盖CLLocationManager的location属性.有关如何做到这一点的任何想法?

如果我做:

class MockCLLocationManager: CLLocationManager {
    var location {
        get {
            return CLLocation(latitude: 0, longitude: 0)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Tom*_*out 10

这可能是一个迟到的答案,但因为我也在寻找相同的东西,它是:

你会用相反的方法吗?首先声明一个在实际CLLocationManager的情况下将使用的协议

protocol LocationManager{
    var location:CLLocation? {get}
}
Run Code Online (Sandbox Code Playgroud)

并使CLLocationManager符合它

extension CLLocationManager:LocationManager{}
Run Code Online (Sandbox Code Playgroud)

这样您可以在测试中模拟位置管理器,如下所示:

class MockLocationManager:LocationManager{
         var location:CLLocation? = CLLocation(latitude: 55.213448, longitude: 20.608194)
}
Run Code Online (Sandbox Code Playgroud)

但是也可以在生产代码中传递CLLocationManager而不是它.

在此处查看更多信息:http://blog.eliperkins.me/mocks-in-swift-via-protocols

  • 不幸的是,链接被破坏了. (2认同)