Swift中的模拟CLBeacon对象

时间:2015-12-24 17:45:33

标签: swift unit-testing clbeacon

我一直在网上搜索一种模拟CLBeacon对象的方法,以便测试我的一个类。我能找到的只与COMockito有关,它只与Objective-c兼容。

我需要的是能够创建一个模拟CLBeacon并设置其主要次要和UUID值。问题是这些参数是只读的。

有什么想法我可以做一个带有我设置参数的模拟CLBeacon吗?

2 个答案:

答案 0 :(得分:2)

我不确定为什么我总是忘记NSCoding,但你可以使用KVO语法来训练CLBeacon对象。我终于让单元测试与CLBeacon一起工作了:

    let mockUUID = NSUUID(UUIDString: uuidString)
    let testBeacon = CLBeacon()
    testBeacon.setValue(testMajor, forKey: "major")
    testBeacon.setValue(testMinor, forKey: "minor")
    testBeacon.setValue(mockUUID, forKey: "proximityUUID")
    testBeacon.setValue(CLProximity.Far.rawValue, forKey: "proximity")

答案 1 :(得分:0)

可能晚到了聚会。发布它以防万一有人面对同样的问题。

不幸的是,至少在撰写本文时,在iOS13中,所有CLBeacon属性都被屏蔽在 _internal NSObject 属性中,而该属性又保留了相对值。 / p>

结果是您不能使用简单的值/键方法。同样,公开的CLBeacon类的公共头文件也没有公开相对方法以任意值初始化内部对象。

This gist,创建一个FakeBeacon Obj-C类,该类重新启用所需的init方法,并允许通过以下方式从Swift进行此类调用:

var beacon = FakeBeacon(fakeWithUUID: UUID(uuidString: uuid)!,
    major: 1,
    minor: 100,
    proximity: 2,
    accuracy: 1,
    rssi: 0,
    timestamp: Date().timeIntervalSinceReferenceDate)

很明显,您不应在生产IPA中包含此类代码,否则苹果的拒绝是不可避免的。