我正在编写单元测试用例,测试模块中需要EAAccessory对象。
因此,我尝试创建EAAccessory对象,而不连接到真正的蓝牙设备和EAAccessoryManager,但是我无法将isConnected和serialNumber分配给EAAccessory实例,因为这些都是只读变量。
因此,我决定模拟EAAccessory类,并通过继承EAAccessory类和重写isConnected和serialNumber变量来返回自己的值,从而创建了EAAccessory类。
我认为一切都很好,因为没有编译器错误。但是我收到了下面给出的运行时错误。
捕获"EAAccessoryInitException","-init不支持。EAAccessoryManager负责创建所有对象。“
所以,有人能引导我模拟EAAccessory类吗?或者,如果没有其他方法可以创建EAAccessory对象,而不需要模拟,也不需要连接到真正的蓝牙设备?
发布于 2019-12-10 15:03:11
不幸的是,在创建您自己的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)
}https://stackoverflow.com/questions/53666524
复制相似问题