【问题标题】:How to test a method that contains Task Async/await in swift如何在 swift 中测试包含 Task Async/await 的方法
【发布时间】:2022-06-23 11:59:21
【问题描述】:

给定以下包含任务的方法。

  • self.interactor 被嘲笑了。
func submitButtonPressed() {
    Task {
        await self.interactor?.fetchSections()
    }
}

如何编写测试来验证 fetchSections() 是从该方法调用的?!

我的第一个想法是使用期望并等待它实现(在模拟代码中)。

但是新的 async/await 有什么更好的方法吗?

【问题讨论】:

  • 我想说更大的问题是您正在尝试对视图控制器进行单元测试(我假设 submitButtonPressed 是 VC 类的一部分,基于其名称)。
  • @Cristik 不一定。这很容易成为处理器中的意图。请注意,它不是动作或@objc 方法,因此不能是按钮的直接动作方法。
  • @matt 因此是我评论中的“我假设”部分。尽管如此,白盒测试主要用于算法,我认为通过查看微小的代码 sn-p,情况并非如此。也不能讨论灰盒测试,因为我们不知道单元和交互者之间的关系。

标签: swift xcode


【解决方案1】:

理想情况下,正如您所暗示的那样,您的 interactor 将使用协议声明,以便您可以替换模拟用于测试目的。然后查询模拟对象以确认调用了所需的方法。通过这种方式,您可以正确地将被测系统的范围限制为仅回答“是否调用了此方法?”的问题

至于测试方法本身的结构,是的,这仍然是异步代码,因此需要异步测试。所以使用期望并等待它是正确的。您的应用程序使用 async/await 来表达异步性这一事实并不会神奇地改变这一点! (您可以通过编写一个创建 BOOL 谓词期望并等待它的实用方法来减少这种冗长。)

【讨论】:

  • 当函数没有完成块时,你将如何使用期望?我想您可以等待任意时间,但这似乎很脆弱。
  • 我也对此感兴趣。期望看起来如何?我猜想在这种情况下调用 fetchSections 的模拟实现时会实现预期,但这似乎有点麻烦,特别是在 submitButtonPressed 被多次调用的测试中。 ?
  • @vrutberg 不,请密切关注 SUT。你只需要测试一次submitButtonPressed——确保它调用fetchSections。您可能在不同的情况下对fetchSections 进行了很多测试,但现在您处于不同的世界。
  • @johnnykehr 我们这样做的方式是,模拟交互器设置自己的属性以指示方法被调用。所以我们就等着吧。
  • 好的。想象一下,如果您要测试的实现是这样的: ` @MainActor` ` func submitButtonPressed() {` Task { let sections = await self.interactor?.fetchSections() sectionCount = sections.count() } } 你将如何测试 sectionCount 变量是否已设置?即使您使用并期望等到调用您的交互协议模拟,该期望也会在设置 sectionCount 之前实现。我猜我们需要在测试时注入 Task.init 并手动控制其执行?
猜你喜欢
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2013-09-13
  • 2019-10-08
相关资源
最近更新 更多