单元测试 UILocalNotification

Posted

技术标签:

【中文标题】单元测试 UILocalNotification【英文标题】:Unit testing UILocalNotification 【发布时间】:2015-10-11 19:46:22 【问题描述】:

我正在编写一个包装UILocalNotifiations 的框架,并且正在为其编写单元测试。它实际上更像是一个功能测试,但无论如何。

所以,我要写的测试是:

func testAlertManagerCanRegisterLocalNotifications() 

    let manager = Manager()
    manager.alerts = DummyAlerts

    let app = UIApplication.sharedApplication()
    let scheduledNotifs = app.scheduledLocalNotifications ?? []
    XCTAssertEqual(scheduledNotifs.count, manager.alerts.count)

鉴于当 alerts 属性发生突变时管理器同步调度 UILocalNotifications,此测试应该通过.. 但它没有。

这里的根本原因是测试没有必要的权限来安排通知,我不知道我应该如何允许测试应用程序获得这些权限?毕竟,没有涉及 UI。

问题:

是否可以强制测试应用拥有必要的UIUserNotification 权限?

【问题讨论】:

当然,一种解决方案是模拟UIApplication 对象,但试图找到更好的方法。 【参考方案1】:

您现在可能已经弄清楚了,但是如果您将虚拟警报设置为立即触发,它不会显示在您的 scheduledNotifs 中。相反,如果您延迟警报,它们将在那里。

【讨论】:

不,它们已正确设置为将来的日期。问题在于权限,如问题中所述......我还没有弄清楚:( 我能够通过先测试注册通知,然后测试创建通知来开始工作【参考方案2】:

我能够通过先进行注册通知的测试,然后进行创建通知的测试来开始工作

func testNotificationRegister() 
    manager.registerForUserNotifications()

    let settings = UIApplication.sharedApplication().currentUserNotificationSettings()
    XCTAssertTrue(settings != .None)


func testCreateNotification()

    let conf = common.createMockConference()
    manager.createNotifcationFromConference(conf, date: NSDate().dateByAddingTimeInterval(30))
    XCTAssertTrue(UIApplication.sharedApplication().scheduledLocalNotifications?.count > 0)

【讨论】:

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

如何为具有 uilocalnotification 的单元格提供单独的颜色

如何重新排列 UILocalNotification 表格视图的单元格?

如何在 didFinishLaunchingWithOptions 中测试 UILocalNotification

Typescript/React 单元测试库,能够单步调试导入的函数

markdown 节点单元测试备忘单:Mocha,Chai和Sinon

做更好的单元测试:关于单测你必须知道的技巧与原则