我正在编写单元测试用例,其中在我的测试模块中需要EAAccessory
对象。
因此,我尝试创建EAAccessory
对象而不连接到实际的蓝牙设备和EAAccessoryManager
,但是由于这些都是只读变量,因此无法将isConnected
和serialNumber
分配给EAAccessory
实例。
因此,我决定模拟EAAccessory
类,并通过继承EAAccessoryMock
类并覆盖EAAccessory
和isConnected
变量以返回自己的值来创建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/