swift - 模拟 UNNotificationResponse 和 UNNotification(以及其他带有 init() 标记为不可用的 iOS 平台类)

标签 swift mocking tdd

我需要模拟 UNNotificationResponseUNNotification 以便我可以测试我的实现:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Swift.Void)

但是我不能有用地子类化这些类,因为 init() 被特别标记为 unavailable,如果我尝试会导致这样的编译错误:

/Path/to/PushClientTests.swift:38:5:无法覆盖已标记为不可用的“init”

这里可以采用哪些替代方法?我研究了面向协议(protocol)的编程路线,但是由于我不控制被调用的 API,因此我无法修改它以采用我编写的协议(protocol)。

最佳答案

为此,您需要执行以下操作。

在调试时获取对象的真实示例,并使用模拟器保存在文件系统中。

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {

let encodedObject = NSKeyedArchiver.archivedData(withRootObject: notification)

let  path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + "/notification.mock"

fileManager.createFile(atPath: path, contents: encodedObject, attributes: nil)


在您的 Mac 中找到该对象并将该文件添加到与测试类相同的目标中。

现在在您的测试中取消存档。


let path = Bundle(for: type(of: self)).path(forResource: "notification", ofType: "mock")

let data = FileManager.default.contents(atPath: path ?? "")

let notification = NSKeyedUnarchiver.unarchiveObject(with: data ?? Data()) as? UNNotification

关于swift - 模拟 UNNotificationResponse 和 UNNotification(以及其他带有 init() 标记为不可用的 iOS 平台类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47438257/

相关文章:

c++ - 如何编译和链接单元测试?

iOS通知观察者单元测试( objective-c )

ios - 从另一个文件中的 SKScene 中删除 UIView

Swift - 每秒一定量的 URL 请求,无需计时器

ios - 如何在 Swift 中使用闭包继承函数

java - 测试依赖时间的服务方法

swift - 无法强制将类型 "[(title: String, description : String, pubDate : String, link : String)]?"的值转换为类型 'NSArray'

java - 使用 mockito 跳过静态方法调用

java - JAX-RS (Reasteasy) Response.readEntity 抛出 : IllegalStateException: RESTEASY003290: Entity is not backed by an input stream

node.js - 使用 Mocha 测试 Node 时未显示测试结果