【问题标题】:How to test method that dispatch work asynchronously in Swift如何测试在 Swift 中异步调度工作的方法
【发布时间】:2021-02-14 19:36:26
【问题描述】:

我需要为以下方法编写单元测试

func setLabelText(msg: String) {
     DispatchQueue.main.async {
          self.label.text = msg
      }
  }

【问题讨论】:

  • 在您的performUIUpdate 示例中,分享您的想法。但是你能分享一些类似于你想要测试的实际代码的东西吗?否则,我们会针对一个模糊的问题提供答案。让问题更具体。
  • 我需要为以下方法编写测试 func setLabelText(msg: String) { DispatchQueue.main.async { self.label.text = msg } }
  • 你能编辑你的问题把它放在那里吗?
  • @JonReid 更新

标签: ios swift xctest xctestcase xctestexpectation


【解决方案1】:

假设您的测试设置已经创建了一个视图控制器并调用loadViewIfNeeded() 来连接任何插座。 (这是来自第 5 章,“加载视图控制器”。)而且这个视图控制器位于一个属性中,我将其命名为 sut(意思是被测系统)。

如果你写一个测试用例调用setLabelText(msg:),然后立即检查视图控制器的标签,这是行不通的。

如果您有调度到后台线程,那么我们需要测试以等待线程完成。但这段代码并非如此。

您的生产代码从后台调用setLabelText(msg:)。但是测试代码在主线程上运行。由于它已经在主线程上,我们需要做的就是再执行一次运行循环。您可以使用我在第 10 章“测试屏幕之间的导航”中介绍的辅助函数来表达这一点:

func executeRunLoop() {
    RunLoop.current.run(until: Date())
}

有了这个,这是一个有效的测试:

func test_setLabelText_thenExecutingMainRunLoop_shouldUpdateLabel() throws {
    sut.setLabelText(msg: "TEST")
    executeRunLoop()
    
    XCTAssertEqual(sut.label.text, "TEST")
}

这成功地测试了方法,并且很快完成。但是,如果另一个程序员出现并更改setLabelText(msg:),将self.label.text = msg 调用拉到DispatchQueue.main.async 之外怎么办?我在第 13 章“测试网络响应(和闭包)”中的“将异步代码保持在闭包中”一节中描述了这个问题。基本上,我们想要测试标签不会在分派的闭包没有运行时发生变化。我们可以通过第二次测试来做到这一点:

func test_setLabelText_withoutExecutingMainRunLoop_shouldNotUpdateLabel() throws {
    sut.label.text = "123"
    
    sut.setLabelText(msg: "TEST")
    
    XCTAssertEqual(sut.label.text, "123")
}

【讨论】:

    【解决方案2】:

    您可以将完成闭包添加到 displayMessage 并在测试中调用expectation.fulfill()。另一种完全不同的方法是实现一些演示设计模式,如协调器或演示器。在这种情况下,您的所有 UI 呈现都将被抽象为非异步方法。

    【讨论】:

      【解决方案3】:

      您好,我认为使用 XCTestExpectation 可能会受益,因为此 api 旨在测试异步操作(您可以阅读有关它的更多信息 here

      就两者之间的比较而言,我唯一能想到的是,使用XCTestExpectation,您将能够测试服务器超时(假设您的 api 没有在预期时间内响应。URLSession 有一个默认时间60 秒内),带有特定的错误代码和消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-09
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多