Ios 如何对涉及CLBeacons的逻辑进行单元测试?
我想在涉及CLBeacons的视图控制器上运行一些测试。不幸的是,尽管CLBeacon本身不是私有类,但其上所有必需的属性都是只读的,没有任何写访问器 这些方法的编写方式应该有助于最大限度地提高可测试性,但如果没有生成CLBeacon的能力,如何测试视图控制器关于它们的逻辑 编辑:Ios 如何对涉及CLBeacons的逻辑进行单元测试?,ios,unit-testing,core-location,ibeacon,Ios,Unit Testing,Core Location,Ibeacon,我想在涉及CLBeacons的视图控制器上运行一些测试。不幸的是,尽管CLBeacon本身不是私有类,但其上所有必需的属性都是只读的,没有任何写访问器 这些方法的编写方式应该有助于最大限度地提高可测试性,但如果没有生成CLBeacon的能力,如何测试视图控制器关于它们的逻辑 编辑: 为了解释我的目的,我有时会在应用程序中遇到一些奇怪的行为。我想通过测试各种场景并确认代码中的各种其他相关组件工作正常,来尝试确认奇怪行为的来源在特定的代码区域中。(例如,我可以测试我的数据处理是否正常工作,因此我知道
为了解释我的目的,我有时会在应用程序中遇到一些奇怪的行为。我想通过测试各种场景并确认代码中的各种其他相关组件工作正常,来尝试确认奇怪行为的来源在特定的代码区域中。(例如,我可以测试我的数据处理是否正常工作,因此我知道是动画/布局代码出现了问题)。由于您无法直接创建CLBeacon实例,也许您可以重构您的方法,将a
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
- (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]);
}
然后,在处理CLBeacon
(监控后)时,您可以简单地使用[[customBeaconWithBeacon:realBeacon]
而不是realBeacon
,并且在测试中,您可以直接实例化CustomBeacon
实例
没有使用CLBeacon那么干净,但这是我所能想到的关于可测试性的最好方法。我已经通过使用XCTest做到了这一点
CLBeacon *mockBeacon = mock([CLBeacon class]);
然后我可以使用它调用作为CoreLocation委托的类上的委托方法。测试可能如下所示:
@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
- (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]);
}
在创建视图控制器时,您可以创建信标,并将信标传递进来,或者只是作为给定方法的参数。