我正在用Swift构建一个iOS应用,该应用使用苹果的CoreBluetooth框架通过低功耗蓝牙与外围设备进行通信。为了对实现CBCentralManagerDelegate和CBPeripheralDelegate协议(protocol)的自定义 Controller 进行单元测试,我提供了一个从CBCentralManager 子类化的测试 double 子类,以模仿CoreBluetooth API的行为。 Controller 的委托(delegate)回调在适当的时间被调用。

到目前为止,它一直运行良好。但是,当涉及到调用CBPeripheralDelegate回调时,需要传递CBPeripheral。通常,我只是伪造提供自己的子类的组件或模拟CBPeripheral的实例。

这是要捕获的:在底层Objective-C库中指定的CBPeripheral初始化程序被标记为不可用,这阻止了我在伪造的CBCentralManager中实例化CBPeripheral并将其作为参数传递给被测CBPeripheralDelegate。 (XCode给我留下了编译器错误。)

到目前为止,我已经尝试在伪造的子类中提供自定义初始化程序(此方法不起作用,因为最终必须调用不可用的指定init),使用扩展名(显然不允许)覆盖初始化程序,并调用选择器(init ),例如我不觉得它无法使用,就像我在Objective-C运行时一样。最后一种方法似乎是最有前途的,但实际上并没有奏效,并且给我留下了错误类型(我的测试类)的非托管对象。

我绝对在这里遇到了障碍,对于任何输入都将感到非常高兴

  • 实例化CBP外围设备,尽管init()不可用
  • 用于对CBPeripheralDelegate进行单元测试的另一种方法
  • 最佳答案

    我设法通过遵循objc-runtime的想法并在Objective-C中创建一个对象工厂来解决了自己的问题,该对象工厂通过其指针调用初始化程序的实现来忽略不可用的标记。

    有关更多信息,请参见:
    http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/
    (这在当前的Swift中不再起作用,但可以轻松地适应)

    10-08 06:08
    查看更多