我想在涉及CLBeacons的视图控制器上运行一些测试。不幸的是,虽然CLBeacons本身不是私有类,但它们上的所有必需属性都是只读的,没有任何写访问器。
这些方法的编写方式应该有助于最大限度地提高可测试性,但是如果没有生成CLBeacons的能力,我该如何测试我的视图控制器关于它们的逻辑?
编辑:
为了解释我的目的范围,我有时会在应用程序中遇到一些奇怪的行为。我想通过测试各种场景并确认我的代码中的各种其他相关组件正常工作来尝试确认奇怪行为的来源是在特定的代码区域中。 (例如,我可以测试我的数据处理是否正常,因此我知道这是动作/布局代码行为不端)。
答案 0 :(得分:4)
我是通过将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]);
}
答案 1 :(得分:1)
由于您无法直接创建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
然后,在处理[[CustomBeacon customBeaconWithBeacon:realBeacon]
(监控后)时,您只需使用realBeacon
代替CLBeacon
,在测试中,您可以直接实例化CustomBeacon
个实例
不像使用CLBeacon那样干净,但这是我能想到的关于可测试性的最佳方法。