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

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

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

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

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

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

最佳答案

不幸的是,您将无法创建自己的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)
}

关于ios - 如何在不连接真实蓝牙设备的情况下创建“EAAccessory”对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53666524/

10-09 02:19