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

4
我想在一个视图控制器上运行一些涉及CLBeacons的测试。不幸的是,虽然CLBeacons本身不是私有类,但它们所有必要的属性都是只读的,没有任何写入访问器。
虽然方法的编写方式应该有助于最大化可测试性,但是如果没有能够生成CLBeacons的能力,如何测试视图控制器关于它们的逻辑呢?
编辑:
为了解释我的目的范围,我有时会在应用程序中遇到奇怪的行为。我想尝试确认奇怪行为的源头是特定代码区域内的问题,通过测试各种情况并确认代码中其他相关组件的正确工作。(例如,我可以测试我的数据处理是否正确,因此我将知道动画/布局代码是否出现问题)。

你可以使用 mock 来模拟信标,并在创建视图控制器时将信标传递进去,或者作为给定方法的参数。http://www.objc.io/issue-1/testing-view-controllers.html - Mike D
2个回答

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

由于您不能直接创建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那样干净,但这是我考虑到可测试性的最佳方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接