XCTest CLLocationManager 的委托方法不会被调用
Posted
技术标签:
【中文标题】XCTest CLLocationManager 的委托方法不会被调用【英文标题】:XCTest CLLocationManager's delegate methods don't get called 【发布时间】:2016-03-14 21:19:38 【问题描述】:我正在为我的 iBeaconManager 编写测试用例。在我的 iBeaconManager 内部包含一个 CLLocationManager 实例,它的委托设置为 iBeaconManager。我将一个 CLCircularRegions 数组传递给我的 iBeaconManager,为每个区域调用我的位置管理器的 [startMonitoringForRegion:] 方法。我的位置管理器的 [didStartMonitoringForRegion:] 由于某种原因没有被调用。我做错了什么?
【问题讨论】:
【参考方案1】:您的测试调用startMonitoringForRegion:
。根据您的设置,这可能会也可能不会触发回调。但即使是这样,它也是异步的并且需要时间。测试完成并在此之前消失。
根据您的目标尝试以下方法之一:
-
端到端测试:让您的测试重新同步异步操作。如果您使用的是直接 XCTest,请创建一个已满足的 XCTestExpectation。其他附加测试库可以使同步更容易。 (我更喜欢 OCHamcrest 的
assertWithTimeout
。)
单元测试:不要使用实际的 CLLocationManager。相反,注入一个假的。然后您的测试可以直接调用didStartMonitoringForRegion:
就好像它已被 CLLocationManager 调用。这是测试来自任何框架的回调的常规方法。
单元测试方法的优点包括速度、可靠性,并且您可以在模拟器上运行(因此它可以成为您持续集成的一部分)。此外,您可以模拟任意数量的条件,而无需创建这些条件。例如,很容易在出现错误或其他极端情况时进行回调。
【讨论】:
以上是关于XCTest CLLocationManager 的委托方法不会被调用的主要内容,如果未能解决你的问题,请参考以下文章
使用 XCTest 在模拟器中使用 StartMonitoringForRegion 未监控 CLBeaconRegion
XCTest 失败并出现异常“非 UI 客户端无法自动暂停”
Xcode 5.0.2 dyld:库未加载:@rpath/XCTest.framework/Versions/A/XCTest