1

我一直在网上寻找一种模拟 CLBeacon 对象的方法,以便测试我的一个类。我能找到的所有内容都与仅与 Objective-c 兼容的 COMockito 有关。

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

关于我可以做些什么来使用我设置的参数来模拟 CLBeacon 有什么想法吗?

4

2 回答 2

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")
于 2015-12-30T22:15:58.680 回答
1

可能迟到了。发布它以防万一有人遇到同样的问题。

不幸的是,至少在撰写本文时的 iOS13 中,所有 CLBeacon 属性都被屏蔽在一个_internal NSObject属性中,而该属性又持有相对值。

结果是您不能使用简单的值/键方法。此外,CLBeacon 类的公开公共标头不会公开相关方法以使用内部对象的任意值进行初始化。

这个要点,创建一个 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 中包含此类代码,否则 Apple 的拒绝是不可避免的。

于 2020-05-02T14:24:31.097 回答