Swift中的VIP架构及测试 (二)
2022-12-01 本文已影响0人
三国韩信
上一篇结尾说了vip架构的好处是很好做unitTesting,这一篇就说一下在VIP架构下,unitTesting怎么做。
一、unit Testing
在VIP架构中,最核心的3部分,controller、interactor、presenter,相应的testing也是针对这3部分的。
1、interactor的testing有2点,一个去mock一个presenter对象,presenter是能获取到interactor的response的,所以mock一个presenter去严重interactor的数据逻辑是否正确。另一个是去mock一个worker对象,interactor的数据源是通过一个个worker去获取的,那么我们要模拟数据的生成就需要去mock一个worker对象去生成测试数据。比如在demo中,就去mock了SCFindListPresenterTest和SCFindListWorkerTest这2个类
class SCFindListPresenterTest: FindListPresenterDataProtocol {
var presenterCalled = false
func presentListData(response: SCFindListModels.FetchLists.Response) {
presenterCalled = true
XCTAssert(!response.isMore, "非上拉加载更多")
XCTAssert(response.dataSource.count == 5, "list数量有误")
XCTAssert(response.count == 5, "list总数量有误")
}
}
class SCFindListWorkerTest: SCFindListWorker {
override func requestForFindListData(cid: Int, pageIndex: Int, pageSize: Int, complete: @escaping (DataModel) -> Void) {
let model = MockData.parserToObject()!
complete(model.data!)
/*DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
let model = MockData.parserToObject()!
complete(model.data!)
}*/
}
2、presenter的testing是要去mock一个controller对象,因为controller是接收presenter数据的,那么我们就可以在controller对象接收的数据里去验证。
class SCFindListControllerTest: SCFindShowListProtocol {
var presenterCalled = false
func showFindList(_ with: SCFindListModels.FetchLists.ViewModel) {
presenterCalled = true
XCTAssert(!with.isMore, "非加载更多")
XCTAssert(with.count == 5, "数量错误")
for item in with.dataSource {
XCTAssert(!item.avatar.isEmpty , "没赋值正确")
XCTAssert(!item.nickname.isEmpty, "没赋值正确")
}
}
}
3、controller的testing就比较多了,包括对interactor发起request的测试,还有页面一些数据加载的testing,比如页面是有tableview的话,要测试tableview的section、row及cell的一些情况。这个就根据具体的页面样式来测试了。在vip中controller是对interactor发起request的,这个是要测试的,故需要mock一个interactor对象来接收request并校验数据。
class SCFindListInteractorTest: FindListDataProtocol {
var interactorCalled = false
func getFindListData(request: SCFindListModels.FetchLists.Request) {
interactorCalled = true
XCTAssert(!request.isMore, "加载错误")
XCTAssert(request.cid == 1, "加载错误")
XCTAssert(request.pageSize == 10, "加载错误")
XCTAssert(request.pageIndex == 1, "加载错误")
}
}