如何在测试用例中测试CLLocationManager的不同权限

时间:2017-05-27 11:52:10

标签: swift xcode

我正在编写测试以测试CoreLocation相关功能。如果未启用位置服务,此函数将引发错误。

func someFunction() throws {
    guard CLLocationManager.locationServicesEnabled() throw NSError.init(
            domain: kCLErrorDomain,
            code: CLError.Code.denied.rawValue,
            userInfo: nil)
    }
    ...
}

在我的测试中,CLLocationManager.locationServicesEnabled()始终为true。有没有办法测试false场景?

1 个答案:

答案 0 :(得分:0)

不是直接使用静态方法,而是将此调用包装在类中,并使该类采用协议,因此您的代码将依赖于该接口而不是具体实现。

protocol LocationManager {
    var islocationServicesEnabled: Bool { get }
}

class CoreLocationManager: LocationManager {
    var islocationServicesEnabled: Bool  {
        return CLLocationManager.locationServicesEnabled()
    }
}

然后你的函数(或类)应该接收该依赖而不是拥有它(依赖注入):

func someFunction(locationManager: LocationManager) throws {
    guard locationManager.islocationServicesEnabled else {
        //...
    }
}

在测试中,您可以传递“假”位置管理器并测试所有方案。 (在您的生产代码中,您传递了CoreLocationManager。)

这是对任何依赖的一般建议。