我目前正在我的应用中添加大量单元测试,以检查 WS 是否处于运行状态。
我完全知道如何使用期望
在 testMethod 内等待。
我想要的东西不太常见。我有一个处理用户收藏夹数据的测试用例。为了确定该用户的状态,我想在案例之前(而不是在每次测试之前)创建一个全新的用户
所以我想使用
public class func setUp() {
//call here WS ( async call )
}
我的问题是,由于我在 class
函数中,我无法使用 expectation
和 waitForExpectation
因为这些是实例方法。
有人知道如何在执行测试之前等待我的 WS 完成吗?
谢谢!
最佳答案
您可以使用信号量技术来完成您想要的事情。
let fakeWSCallProcessingTimeInSeconds = 2.0
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(fakeWSCallProcessingTimeInSeconds * Double(NSEC_PER_SEC)))
let semaphore = dispatch_semaphore_create(0)
dispatch_after(delayTime, dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) {
dispatch_semaphore_signal(semaphore)
}
let timeoutInNanoSeconds = 5 * 1000000000
let timeout = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutInNanoSeconds))
if dispatch_semaphore_wait(semaphore, timeout) != 0 {
XCTFail("WS operation timed out")
}
此代码将伪造一个延迟 2 秒的 Web 服务调用 (dispatch_after),在您的情况下,应将其替换为实际调用。调用完成并设置用户对象后,您可以使用“dispatch_semaphore_signal(semaphore)”来释放信号量对象。如果它在 5 秒内不可用(请参阅timeoutInNanoSeconds),则测试将被视为失败。显然,您可以根据需要更改这些值。
其余测试将在信号量空闲后或发生超时时运行。
有关信号量的更多信息可以在 Apple docs 中找到.
关于Xcode 单元测试,等待 `class setUp()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37696099/