我正在编写单元测试用例,其中在我的测试模块中需要EAAccessory
对象。
因此,我尝试创建EAAccessory
对象而不连接到真正的蓝牙设备和EAAccessoryManager
,但是我无法将isConnected
和serialNumber
分配给EAAccessory
实例,因为这些是只读变量。
因此,我决定模拟EAAccessory
类,并通过继承EAAccessoryMock
类并覆盖EAAccessory
和isConnected
变量以返回我自己的值来创建serialNumber
类。
我以为一切都很好,因为没有编译器错误。但是我收到下面给出的运行时错误。
捕获到“ EAAccessoryInitException”,“不支持-init。EAAccessoryManager负责创建所有对象。”
所以有人可以指导我模拟EAAccessory
类,或者是否有其他方法可以创建EAAccessory
对象而无需模拟并且无需连接到真正的蓝牙设备?
答案 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)
}