티스토리 뷰

iOS

[iOS] 비동기 API 호출 UnitTest 하는법

관(Gwan) 2021. 6. 21. 14:12

샘플 프로젝트에 MVVM 적용하면서 ViewModel을 통해 비동기로 API 호출하는 로직을 unitTest 할 일이 있었는데,

 

처음에 이런식으로 api 호출 후에 성공하면 completionHandler 에서 isSuccess를 true로 바꿔주고 XCTAssertTrue에서 isSuccess가 true면 테스트가 성공하게 짰더니 completionHandler가 실행되기 전에 testLogin 메서드가 종료되어 버려서 테스트에 실패하더라구요.

 

찾아보니 애플 Developer 사이트에 위와같은 예제가 있던데 expectation을 이용해 지정한 시간만큼 대기하다가 시간안에 fulfill이 되면 다음 작업을 실행하고 fulfill이 되지 않으면 timeout되어 test 메서드가 실패한다고 되어있네요.

 

위의 예제를 참고하여 작성한 테스트코드 인데요

로직은 동일하고 expectation을 추가했습니다. requestLogin 메서드를 실행 한 뒤 wait(for: [exp], timeout: 5.0) 메서드를 실행하여 5초간 대기하는데, requestLogin의 api 통신이 성공하여 completionHandler가 실행되면 안에 exp.fulfill()이 실행되어 wait의 다음 줄인 XCTAssertTrue(isSuccess)가 실행됩니다. 결과는 성공이겠죠?

만약 통신이 실패하거나 늦어져 지정된 시간인 5초안에 completionHandler가 실행되지 않는다면 XCTAssertTrue(isSuccess)의 실행 없이 테스트는 실패합니다.

 

bind를 하는 경우도 마찬가지로 바인드 하는 클로저에 fulfill() 메서드를 넣어주면 동일하게 동작합니다.

댓글