비동기 테스트
2024. 7. 8. 22:33ㆍiOS
비동기 테스트
먼저 테스트코드를 작성하신다면 이런식으로 하시는분들도 계실꺼라 생각됩니다.
final class CalculatorQueueTests: XCTestCase {
var sut: CalculatorItemQueue<Int>!
override func setUpWithError() throws {
try super.setUpWithError()
sut = CalculatorItemQueue<Int>()
}
override func tearDownWithError() throws {
try super.tearDownWithError()
sut = nil
}
func test_enqueue_11_enqueue의_마지막값이11인지_확인() {
//given
let input = 11
//when
sut.enqueue(item: input)
//then
XCTAssertEqual(input, sut.lastItem)
}
}
이런식으로 큐에 값을 저장하며 그값이 어떤값인지 혹은 연산을 통하여 값을 계산 한것에 대해서 테스트를 할 수 있습니다.(+, -, *, /)
위의 예시 처럼 다양하게 테스트 코드를 작성 하실텐데요.
이것 말고도 테스트 코드를 작성할때에 비동기 부분을 테스트 할때도 있을것입니다.
그래서 비동기에 대해서 방법을 한번 적어보려고합니다.
먼저 간단하게 통신을 하여 성공과 실패를 나누는데에 있어서 무조건 success가 되어 뭐지? 라는 부분이 들어서 왜 그런지 확인을 해봤습니다.
이러한 부분에 있어 비동기 테스트를 할때에는 추가적인 작업을 진행했어야 했습니다.
path 값이..... 이상한?.. 그런데 왜 success? 나타나죠?
통신을 하는것에 있어서 비동기가 처리 되기 때문에
특정 메서드를 추가해주어야 한다는것을 알게 되었습니다.
let expectation = self.expectation(description: "")
expectation.fulfill()
wait(for: [expectation], timeout: 1.0)
여기 3개의 메서드를 추가하여 잘못된것을 잡아 다시 테스트를 진행했습니다!
먼저 핵심은..!expectation(description:)
,fulfill()
,wait(for:timeout:)
이렇게 3가지가 있습니다.
기대 설정 (Expectation)
코드 복사
let expectation = self.expectation(description: "????")
이 줄은 XCTest의 기대치를 생성하는 코드입니다.
expectation은 비동기 테스트를 위해 사용됩니다.
여기서는 "Fetch home feed combine"이라는 설명을 가진 기대치를 생성하여,
테스트가 비동기 작업이 완료될 때까지 기다리도록 설정합니다.
기대 대기 (Wait)
코드 복사
wait(for: [expectation], timeout: 1.0)
이 줄은 테스트가 기대치가 충족될 때까지 대기하는 코드입니다.
wait(for: [expectation], timeout: 1.0)은
설정한 기대치(expectation)가 충족되기를 최대 1초간 기다립니다.
만약 1초 내에 기대치가 충족되지 않으면 테스트는 실패합니다.
정리
Mock 퍼블리셔 설정: mockRepository.fetchHomeFeedCombineReturnValue에 homeFeed를 발행하는 퍼블리셔를 설정합니다.
비동기 작업 기대 설정: expectation을 생성하여 테스트가 비동기 작업을 기다리도록 합니다.
기대 대기: wait(for: [expectation], timeout: 1.0)을 사용하여 테스트가 기대치가 충족될 때까지 대기하도록 합니다.
let spot = CardSpot(...)
let cardData = CardDatum(...)
let card = Domain.CardList(...)
let home = Domain.F....(...)
let homeFeed = Domain.H....(...)
mockRepository.fetch....Value = Just(homeFeed)
.setFailureType(to: Domain.APIError.self)
.eraseToAnyPublisher()
//여기 추가
let expectation = self.expectation(description: "")
// When
viewModel.fetch.....(id: 1)
// Then
viewModel.$home...
.dropFirst()
.sink { receivedFeed in
XCTAssertEqual(receivedFeed?.message, "")
//여기 추가
expectation.fulfill()
}
.store(in: &cancellables)
//추가
wait(for: [expectation], timeout: 1.0)
이런식으로 비동기를 통한 테스트를 진행할때엔 메서드를 추가 하여 작업을 해야한다.....!!
이렇게 테스트가 완료 되었습니다!
'iOS' 카테고리의 다른 글
Equatable와 Hashable 프로토콜 (0) | 2025.02.01 |
---|---|
Completion(escaping) 와 Combine (0) | 2025.01.26 |
컴파일 최적화 방법 (0) | 2024.05.05 |
Concurrency (await) (0) | 2024.04.16 |
스파게티코드 해결방안 고민하기 (3) | 2024.04.15 |