Xcode 单元测试,在 `class setUp()` 中等待
Posted
技术标签:
【中文标题】Xcode 单元测试,在 `class setUp()` 中等待【英文标题】:Xcode Unit Testing, wait in `class setUp()` 【发布时间】:2016-06-08 07:35:55 【问题描述】:我目前正在我的应用程序中添加大量单元测试,以检查 WS 是否处于运行状态。
我完全知道如何在 testMethod 中等待,使用 expectations
。
我想要的不太常见。我有一个处理用户收藏数据的测试用例。为了确定这个用户的状态,我想在案例之前(而不是在每次测试之前)创建一个全新的用户
所以我想用
public class func setUp()
//call here WS ( async call )
我的问题是,因为我在 class
函数中,所以我不能使用 expectation
和 waitForExpectation
,因为它们是实例方法。
有没有人知道如何在执行测试之前等待我的 WS 完成?
谢谢!
【问题讨论】:
【参考方案1】:你可以使用信号量技术来完成你想要的。
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 秒延迟 (dispatch_after) 的 Web 服务调用,在您的情况下应将其替换为实际调用。一旦调用完成并设置了用户对象,就可以使用“dispatch_semaphore_signal(semaphore)”来释放信号量对象。如果在 5 秒内不可用(参见 timeoutInNanoSeconds),则测试被视为失败。显然,您可以根据需要更改值。
其余测试将在信号量空闲后或发生超时时运行。
更多关于信号量的信息可以在Apple docs找到。
【讨论】:
【参考方案2】:我自己找到的。我不应该使用期望,因为设置部分不是测试的一部分。
我应该改用dispatch_group
:
override class func setUp()
super.setUp()
let group = dispatch_group_create()
dispatch_group_enter(group)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0))
let account = MyAccount()
WS.worker.createAccount(account, password: "test") (success, error) in
dispatch_group_leave(group)
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, Int64(50 * Double(NSEC_PER_SEC))))
【讨论】:
以上是关于Xcode 单元测试,在 `class setUp()` 中等待的主要内容,如果未能解决你的问题,请参考以下文章
为 Xcode 项目创建单元测试会导致错误:显示最近的消息:-1:未定义符号:_OBJC_CLASS_$_FBSDKCodelessIndexer
在使用 Cocoapods 的项目中执行单元测试时,“两个都实现了 Class X”