本地通知的单元测试

4
我花了一整天的时间试图找到一种方法来对我的本地通知进行单元测试。
我使用的是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个回答

0

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

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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接