프로젝트
-
Rxswift - 에러 발생 이후 작업 재시도가 되지 않는 문제 해결프로젝트 2024. 2. 11. 14:44
문제상황 버튼을 탭하면 답글을 서버에 등록하는 비동기 작업을 수행하려는데, 한 번 에러가 발생하면 다시 버튼을 눌러도 작업이 실행되지 않는 문제가 발생했다. 문제해결과정 이 상황에서 필자가 설정한 목표는 다음과 같다. 1. 에러 발생 후에도 답글 등록 작업을 시도할 수 있게 한다. 2. 등록 시도할 때마다 에러 발생 시 에러 메시지를 보여주도록 한다. 이 문제가 발생했을 때의 댓글 등록 작업을 수행하는 subscription 코드는 다음과 같다. // "등록" 버튼 탭할 시 서버에 답글을 등록 addReplyButton.rx.tap .flatMap { [weak self] in guard let self else { return Observable.empty() } return self.viewModel..
-
Core Data에서 의도치 않은 entity 생성 문제 해결프로젝트 2023. 3. 30. 15:23
문제 상황 SwiftUI와 Core Data를 사용하여 과거의 기억을 회고하는 앱을 만들고 있었다. 그런데 사용자가 Core Data entity를 만들다가 저장하지 않았는데, 다른 탭에 있다가 원래 탭으로 돌아오면 의도치 않게 생성되어 있는 상황이다. 문제 분석 view context의 save() 메서드의 경우, 공식문서의 정의에 의하면 저장되지 않은 변경사항을 commit하는 메서드이다. 이러한 정의를 참고해 봤을 때 버그 발생 과정은 다음과 같다. 왼쪽 탭에서 오른쪽 탭으로 넘어갈 때 저장되지 않은 entity가 방치됨 오른쪽 탭에서 카테고리 entity에 대한 CRUD를 하면서 view context의 save() 호출 왼쪽 탭에서 방치된 entity도 저장됨 왼쪽 탭으로 돌아오면서 fetch ..
-
view controller unit test에서 presentedViewController 문제프로젝트 2023. 3. 18. 17:37
문제 상황 view controller에서 modal sheet에 대한 테스트를 하기 위해 다음과 같이 테스트를 작성하였다. modal sheet가 정상적으로 보이는 지를 테스트하기 위해 root view controller의 presentedViewController프로퍼티 값을 체크하는 테스트이다. final class MapViewControllerTests: XCTestCase { func testViewController_whenSelectAttraction_updatesUI() { // ... XCTAssertEqual(sut.presentedViewController, sut.attractionInfoSheetController) // ... } } 테스트를 통과할 수 있도록 다음과 같이 s..
-
공공 API 호출 시 SSL 에러 해결프로젝트 2023. 3. 15. 21:00
문제 상황 실제로 API 호출 시의 기능이 잘 처리되는지를 파악하기 위해 MockURLSession 대신 진짜 URLSession을 주입한 NetworkManager에 대한 테스트를 작성하였다. final class NetworkManagerIntegrationTests: XCTestCase { let sut = NetworkManager(session: URLSession.shared) func testFetchAttractions() { let expectation = expectation(description: "Task must be executed.") Task { do { let attractions = try await sut.fetchAllAttractions() XCTAssertEqual..