在 Swift 中模拟 CLBeacon 对象
Mock CLBeacon Object in Swift
我一直在网上搜索一种模拟 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 属性都被屏蔽在 _internal NSObject 中属性 依次持有相对值。
结果是您不能使用简单的 value/key 方法。此外,CLBeacon class 的暴露 public header 不会将相对方法暴露给具有任意值的 init 内部 object.
This gist,创建一个 FakeBeacon Obj-C class,re-enable 所需的 init 方法,允许这样的调用也来自 Swift,在下面方式:
var beacon = FakeBeacon(fakeWithUUID: UUID(uuidString: uuid)!,
major: 1,
minor: 100,
proximity: 2,
accuracy: 1,
rssi: 0,
timestamp: Date().timeIntervalSinceReferenceDate)
显然,您不应该在生产 IPA 中包含此类代码,否则 Apple 的拒绝是不可避免的。
我一直在网上搜索一种模拟 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 属性都被屏蔽在 _internal NSObject 中属性 依次持有相对值。
结果是您不能使用简单的 value/key 方法。此外,CLBeacon class 的暴露 public header 不会将相对方法暴露给具有任意值的 init 内部 object.
This gist,创建一个 FakeBeacon Obj-C class,re-enable 所需的 init 方法,允许这样的调用也来自 Swift,在下面方式:
var beacon = FakeBeacon(fakeWithUUID: UUID(uuidString: uuid)!,
major: 1,
minor: 100,
proximity: 2,
accuracy: 1,
rssi: 0,
timestamp: Date().timeIntervalSinceReferenceDate)
显然,您不应该在生产 IPA 中包含此类代码,否则 Apple 的拒绝是不可避免的。