XCTest 中的测试通知(UI 测试)

Posted

技术标签:

【中文标题】XCTest 中的测试通知(UI 测试)【英文标题】:Testing notifications in XCTests (UITests) 【发布时间】:2018-09-07 07:18:44 【问题描述】:

我在通知测试方面遇到了一些问题。我在全新且干净的项目中复制了该案例,但仍然无法在测试中收到我的通知。

viewDidLoad() 方法中,我这样发布通知:

DispatchQueue.main.asyncAfter(deadline: .now() + 3) 
    NotificationCenter.default.post(name: Notification.Name("Test"), object: nil, userInfo: nil);

在我的测试中我试图抓住它:

var app: XCUIApplication!        
override func setUp() 
     super.setUp()
     continueAfterFailure = false
     app = XCUIApplication()
     app.launch()

func testExample() 
     expectation(forNotification: Notification.Name("Test"), object: nil)  notification in
         return true
     
     waitForExpectations(timeout: 10, handler: nil)
  

但它不起作用。

我在*** 上找到了一些我应该满足期望的信息,但我的处理程序没有被触发这样做。

简单的代码,简单的测试,但它不起作用 - 真令人沮丧。

顺便说一句,我在 Xcode 9.4.1 中使用 UITests,发现 UnitTests 一切正常。可能的错误?

【问题讨论】:

@Ashley Mills 为什么在 2 秒后标记为重复?我已经在我的示例代码中实现了链接解决方案 请发布您的整个测试代码,包括您实例化视图控制器的位。 @Oletha 谢谢回复。我正在使用 UITests,所以手动控制器实例化不是我的情况。我已经更新了我的测试 sn-p 以包含所有与测试相关的代码 【参考方案1】:

您将无法在 UI 测试中测试 Notifications 的接收,因为 UI 测试运行器在您的应用的单独运行时中运行。

要使用expectation(forNotification:object:handler:) 直接测试Notification 是否发布,您需要使用单元测试。如果您想对该场景进行 UI 测试,您将需要测试通知在屏幕上显示的结果,从而暗示通知已发送。如果发布的通知没有可见的结果,您将无法对其进行 UI 测试。

【讨论】:

我设法通过 UITest 中的输出来测试通知的一部分,并通过在 UnitTests 中收听通知来测试其余部分。这不是完美的解决方案,但已经足够好了。感谢@Oletha 节省了我头上的头发:)

以上是关于XCTest 中的测试通知(UI 测试)的主要内容,如果未能解决你的问题,请参考以下文章

xcrun 来自 iOS 上的 XCTest

iOS 测试推送通知的最佳实践(UI 测试)

iOS 中的 XCTest 和 UI 测试

我可以使用 UI 测试来测试通知是不是出现吗?

如何使用 XCTest UI 测试区分 iOS 13 中的标题和静态文本

如何从 XCTest 中的 UI 目标调用主目标中的方法?