【问题标题】:Mock CLBeacon Object in Swift在 Swift 中模拟 CLBeacon 对象
【发布时间】:2016-03-31 02:27:17
【问题描述】:

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

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

知道我可以做些什么来使用我设置的参数来模拟 CLBeacon 吗?

【问题讨论】:

    标签: swift unit-testing clbeacon


    【解决方案1】:

    我不确定为什么我总是忘记 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")
    

    【讨论】:

    • 抱歉回复晚了,我刚试了一下,好像没有成功改变major、minor和UUID的值。当我尝试打印 CLBeacon 对象时,它显示它的所有值都设置为 null。我把你分享的代码放在了 setUp() 函数上,我做错了吗?
    • 使用 Swift 3,我得到一个 NSUnknownKeyException。请问有人能解决这个问题吗?
    【解决方案2】:

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

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

    结果是您不能使用简单的值/键方法。此外,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 中包含此类代码,否则 Apple 的拒绝是不可避免的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      相关资源
      最近更新 更多