【问题标题】:How do I unit-test logic involving CLBeacons?如何对涉及 CLBeacon 的逻辑进行单元测试?
【发布时间】:2014-06-27 19:47:23
【问题描述】:
我想在涉及 CLBeacon 的视图控制器上运行一些测试。不幸的是,虽然 CLBeacons 本身不是私有类,但它们的所有必要属性都是只读的,没有任何写访问器。
这些方法的编写方式应该有助于最大限度地提高可测试性,但没有生成 CLBeacon 的能力,我如何测试我的视图控制器关于它们的逻辑?
编辑:
为了解释我的目的范围,我有时会在应用程序中遇到一些奇怪的行为。我想通过测试各种场景并确认我的代码中的各种其他相关组件是否正常工作来尝试确认奇怪行为的来源是在特定的代码区域中。 (例如,我可以测试我的数据处理是否正常工作,因此我会知道是动画/布局代码行为不端)。
【问题讨论】:
标签:
ios
unit-testing
core-location
ibeacon
【解决方案1】:
我已经通过将OCMockito 与 XCTest 一起使用来完成此操作。
CLBeacon *mockBeacon = mock([CLBeacon class]);
然后我可以使用它来调用作为 CoreLocation 委托的类的委托方法。测试可能如下所示:
- (void)testDidRangeOnABeacon
{
MyLocationDelegate *myDelegate = [[MyLocationDelegate alloc] init];
CLLocationManager *mockManager = mock([CLLocationManager class]);
CLBeacon *mockBeacon = mock([CLBeacon class]);
CLBeaconRegion *mockRegion = mock([CLBeaconRegion class]);
[myDelegate locationManager:mockManager
didRangeBeacons:@[mockBeacon]
inRegion:mockRegion];
// XCTAsserts...
XCTAssert([myDelegate.checkSomethingAboutRanging]);
}
【解决方案2】:
由于您不能直接创建 CLBeacon 实例,也许您可以重构您的方法以将 CustomBeacon 作为参数,定义如下:
@interface CustomBeacon : NSObject
@property (nonatomic, strong) NSNumber *major;
@property (nonatomic, strong) NSNumber *minor;
@property (nonatomic, assign) CLProximity proximity;
// plus all other fields in CLBeacon..
+ (instancetype) customBeaconWithBeacon:(CLBeacon *) beacon;
- (instancetype) initWithBeacon:(CLBeacon *) beacon;
@end
那么当你处理CLBeacon(在监控之后)时,你可以简单地使用[[CustomBeacon customBeaconWithBeacon:realBeacon]而不是realBeacon,并且在你的测试中你可以直接实例化你的CustomBeacon实例。
不如使用 CLBeacon 干净,但这是我能想到的关于可测试性的最佳选择。