iOS中异步操作的UnitTest
要直接测试网络和异步调用,可以使用XCTest提供的expectationWithDescription+waitForExpectationsWithTimeout,举个例子:
|
测试方法按 test方法名测试场景期望结果 的格式命名。首先在异步回调外面调用expectationWithDescription方法得到一个expectation,这个方法接受一个字符串,用来描述本次测试,我传了个空串,因为我们的测试方法名已经足够清晰了。然后在回调中调用expectation.fulfill()表明满足测试条件,接下来就可以进行断言。最后别忘了在回调外面加上waitForExpectationsWithTimeout(timeout, handler: nil),如果时间超过timeout回调还没有执行,就会测试失败,hander会在超时后调用,可以写一些清空状态和还原现场的操作,以免影响之后的测试,譬如task?.cancel()。
但是上面这个测试很不稳定,我们可能因为网络不佳测试失败,而不是因为我们的代码本身有逻辑错误,而且这个测试有可能非常慢,而如果我们的网络层是封装的Alamofire的话,其实Alamofire已经帮我们做好了上面的测试了,所以我们只需要测试我们调用Alamofire的方法有没有问题。
比如下面这个方法:
|
一般只需要测试它的返回值是否符合预期:
|
但是因为上面的方法还调用了一个parseResult的方法来处理数据:
|
所以我们还需要测试这个方法:
|
这个测试也是测试返回值,测试了几种可能发生的情况,基本可以保证parseResult方法的正确性。
这样一个简单的网络层的单元测试就写好了。
关于封装的网络层地址: SwiftDemo, 里边还有一个简单的Swift初始工程