-2

有没有办法强制 Alamofire 在主线程上完成所有工作?这是一个测试场景,我需要主线程在网络调用完成并且我知道状态之前不继续执行。有问题的测试曾经在XCTest框架下运行,所以我会XCTestExpectation等待完成。我使用的环境不适用XCTest,所以我需要 Alamofire 是同步的。


由于前 2 条评论都建议了我应该如何测试,让我提供更多的上下文。

在过去的 2 年里,我有大约 100 个测试运行良好。这些测试不是单元测试,而是使用 Google 的 EarlGrey 1 进行的 UI 测试。EarlGrey 1 提供了在 XCTest 下运行的 UI 测试,因此您可以将 UI 测试与应用程序状态的白盒检查结合起来。这很棒。

Earl Gray 1 不支持 iOS 13,因此我将测试移植到 EarlGrey 2,它在 XCUITest 之上运行。对于白盒方面,您可以从测试过程远程调用注入到您的应用程序中的包。

在这种情况下,“模拟”是服务器,但它确实会进行网络调用,并且当我调用测试包时会发生这些情况。我需要知道他们什么时候完成,这样我才能在他们完成后返回。

4

1 回答 1

1

回答您的问题:没有适当的方法可以强制 Alamofire 使用 Alamorefire 本身在主线程上进行调用。一般来说,您可以使用信号量使线程等待结果。Alamofire 似乎在主线程上响应,因此可能会导致死锁。

您可以让线程休眠,直到回调被处理:

var result: Data?
var done = false

// Do a call which will finish asynchonously
someCall(withBlock: { someResult in
    // Once done,
    result = someResult
    done = true
})

// Make the main thread wait
while(!done) {
    Thread.sleep(forTimeInterval: 0.1)
}

// This will be called after the block has been completed
print("\(result)")

这同样适用于 Alamofire 调用,请注意这可能会造成线程相互等待的死锁。

但可以帮助您解决问题。理想情况下,您不会因为多种原因等待在测试中执行网络调用,包括:

  • 测试应该只涵盖单个功能,网络调用不止于此。
  • 包括网络调用意味着外部因素(例如没有互联网连接)会影响测试结果,尽管它很少说明您的代码按预期执行。

一种常见的方法是“模拟”应该被视为超出测试范围的部分。这是一篇关于为 Alamofire 执行此操作的帖子

于 2020-03-24T15:23:25.623 回答