我花了最后一天左右试图找出一种方法来对我的本地通知进行单元测试.
我正在使用Swift 2.2和Xcode 7.3
基本上,我有一个生成UILocalNotification的精简API,它通过UIApplication.sharedApplication()触发.presentLocalNotificationNow
在我的AppDelegate中,我实现了应用程序: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所以我可以测试是否调用了应用程序:didReceiveLocalNotification,类似于UIApplication.sharedApplication().委托= mockedDelegate,当我试图这样做时它崩溃了.
我的下一个想法是使用UI测试和监视器进行警报对话框.这工作到了一定程度,我能够注册通知(并获得“允许通知”对话框,我可以使用XCTestCase API轻松通过),但通知显示为横幅,而不是警报(从应用程序本身内部)!?
在这一点上,我不知道接下来要尝试什么.
我目前没有使用任何模拟框架,我的理解是Swift并不适合他们,但这只是我的阅读(除非我愿意从NSObject扩展).
解决方法
您可以通过创建本地通知并在测试中直接调用它来测试委托方法,如下所示:
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)