如何在不连接真实蓝牙设备的情况下创建“ EAAccessory”对象?

时间:2018-12-07 09:19:25

标签: ios swift bluetooth eaaccessory

我正在编写单元测试用例,其中在我的测试模块中需要EAAccessory对象。

因此,我尝试创建EAAccessory对象而不连接到真正的蓝牙设备和EAAccessoryManager,但是我无法将isConnectedserialNumber分配给EAAccessory实例,因为这些是只读变量。

因此,我决定模拟EAAccessory类,并通过继承EAAccessoryMock类并覆盖EAAccessoryisConnected变量以返回我自己的值来创建serialNumber类。

我以为一切都很好,因为没有编译器错误。但是我收到下面给出的运行时错误。

  

捕获到“ EAAccessoryInitException”,“不支持-init。EAAccessoryManager负责创建所有对象。”

所以有人可以指导我模拟EAAccessory类,或者是否有其他方法可以创建EAAccessory对象而无需模拟并且无需连接到真正的蓝牙设备?

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法创建自己的EAAccessory对象实例或对该类进行子类化。有一种更好的模拟方法,尽管它不需要触摸EAAccessory类本身(嗯,差不多)。

最简单的方法是定义一个协议,该协议包含所需的所有EAAccessory值,然后为符合新协议的EAAccessory类定义一个空扩展,像这样:

protocol MyAccessory {
    var isConnected: Bool { get }
    var serialNumber: String { get }
}

extension EAAccessory: MyAccessory {}

然后,如果您正在使用EAAccessoryDidConnect通知监听附件,则可以将userInfo字典中的值解包为新协议类型,而不是EAAccessory

let myAccessoryObject = notification.userInfo?[EAAccessoryKey] as? MyAccessory

要测试和模拟附件,现在要做的就是创建一个符合MyAccessory协议而不是EAAccessory类的新类或结构:

struct MockAccessory: MyAccessory {
    let name: String
    let protocolStrings: [String]
}

func testSendingNotifications() {
    let userInfo: [AnyHashable: Any] = [
        EAAccessoryKey: MockAccessory(isConnected: true, serialNumber: "cocoa-puffs")
    ]
    NotificationCenter.default.post(name: NSNotification.Name.EAAccessoryDidConnect,
                                    object: nil,
                                    userInfo: userInfo)
}