2

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

所以我尝试在EAAccessory不连接到真正的蓝牙设备的情况下创建对象EAAccessoryManager,但是我无法分配isConnected和实例serialNumberEAAccessory因为这些是只读变量。

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

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

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

那么任何人都可以指导我模拟EAAccessory类或者是否有任何其他方法可以在不模拟EAAccessory且不连接到真正的蓝牙设备的情况下创建对象?

4

1 回答 1

1

不幸的是,您在创建自己的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)
}
于 2019-12-10T15:03:11.307 回答