单元测试本地通知
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)
您可以类似地调用其他委托方法来测试通知操作等。
【讨论】:
以上是关于单元测试本地通知的主要内容,如果未能解决你的问题,请参考以下文章