Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何对涉及CLBeacons的逻辑进行单元测试?_Ios_Unit Testing_Core Location_Ibeacon - Fatal编程技术网

Ios 如何对涉及CLBeacons的逻辑进行单元测试?

Ios 如何对涉及CLBeacons的逻辑进行单元测试?,ios,unit-testing,core-location,ibeacon,Ios,Unit Testing,Core Location,Ibeacon,我想在涉及CLBeacons的视图控制器上运行一些测试。不幸的是,尽管CLBeacon本身不是私有类,但其上所有必需的属性都是只读的,没有任何写访问器 这些方法的编写方式应该有助于最大限度地提高可测试性,但如果没有生成CLBeacon的能力,如何测试视图控制器关于它们的逻辑 编辑: 为了解释我的目的,我有时会在应用程序中遇到一些奇怪的行为。我想通过测试各种场景并确认代码中的各种其他相关组件工作正常,来尝试确认奇怪行为的来源在特定的代码区域中。(例如,我可以测试我的数据处理是否正常工作,因此我知道

我想在涉及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]);
}
在创建视图控制器时,您可以创建信标,并将信标传递进来,或者只是作为给定方法的参数。