我一直在网上搜索模拟CLBeacon对象的方法,以便测试我的一个类。我所能找到的都是与COMockito相关的,它只与Objective-c兼容。
我所需要的只是能够创建一个模拟CLBeacon,并设置其主要次要值和UUID值。问题是这些参数是只读的。
你知道我可以做些什么来制作一个带有我设置的参数的模拟CLBeacon吗?
我不知道为什么我总是忘记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")
聚会可能迟到了。发布它只是为了防止有人遇到同样的问题。
不幸的是,至少在撰写本文时的iOS13中,所有CLBeacon属性都被屏蔽在_internalNSObject属性中,该属性反过来保持相对值。
结果是您无法使用简单的值/键方法。此外,CLBeacon类公开的公共头不会向init公开相对方法,该方法具有内部对象的任意值。
这个要点,创建一个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中包含这样的代码,否则苹果的拒绝是不可避免的。