单元测试本地通知

Posted

技术标签:

【中文标题】单元测试本地通知【英文标题】:Unit Testing Local Notifications 【发布时间】:2016-05-09 22:23:06 【问题描述】:

我花了最后一天左右的时间试图找出一种方法来对我的本地通知进行单元测试。

我正在使用 Swift 2.2 和 Xcode 7.3

基本上,我有一个精简的 API,它生成 UILocalNotification,通过 UIApplication.sharedApplication().presentLocalNotificationNow 触发

在我的AppDelegate 中,我实现了application:didReceiveLocalNotification 方法来显示UIAlertController,如下所示

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) 
    if application.applicationState == .Active 
        var topController : UIViewController = (application.keyWindow?.rootViewController)!

        while ((topController.presentedViewController) != nil) 
            topController = topController.presentedViewController!
        

        let alert = UIAlertController(title: notification.alertTitle, message: notification.alertBody, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: (action: UIAlertAction!) in))

        topController.presentViewController(alert, animated: true, completion: nil)
    

手动运行时,它工作正常。我可以看到生成的消息和显示的警报。

我想做的是提供一个单元测试来验证这个功能。

我没有测试 ios 的经验。

我的第一个想法是以某种方式模拟UIApplicationDeledgate,以便我可以测试是否调用了application:didReceiveLocalNotification,例如UIApplication.sharedApplication().delegate = mockedDelegate,当我尝试这样做时它崩溃了。

我的下一个想法是对警报对话框使用 UI 测试和监视器。这在一定程度上奏效了,我能够注册通知(并获得“允许通知”对话框,我可以使用XCTestCase API 来点击它),但通知显示为横幅,而不是警报(来自应用程序本身)!?

此时我不知道下一步该尝试什么。

我目前没有使用任何模拟框架,我的理解是 Swift 并不适合它们,但这只是我的阅读(除非我愿意从 NSObject 扩展)。

【问题讨论】:

【参考方案1】:

您可以通过创建本地通知并直接在测试中调用它来测试委托方法,如下所示:

let notification = UILocalNotification()
notification.alertBody = "Attention!"
var userInfo  = [String: String]()
userInfo["name"] = "notification"
notification.userInfo = userInfo
// further notification setup

let appDelegate = UIApplication.sharedApplication().delegate
appDelegate?.application!(UIApplication.sharedApplication(), didReceiveLocalNotification: notification)

您可以类似地调用其他委托方法来测试通知操作等。

【讨论】:

以上是关于单元测试本地通知的主要内容,如果未能解决你的问题,请参考以下文章

测试本地推送通知

如何为本地通知界面编写适当的测试?

如何在 Apple Watch 模拟器中测试本地通知?

IOS 取消本地通知

如何实现预定的本地通知

本地通知不会出现 - iOS