잘못된 테스트의 예시

class LetsGitHubSearchTests: XCTestCase {

    func testSearch_searchGitHub() {
        // given
        let expectation = XCTestExpectation()
        XCTWaiter().wait(for: [expectation], timeout: 10)
        
        RepositoryService.search(
            keyword: "RxSwift") { result in
                expectation.fulfill()
                XCTAssertEqual(result.isSuccess, true)
                XCTAssertEqual(result.value?.items.contains {
                    $0.name == "RxSwift"
                }, true)
            }
    }
}

→ 그렇기 때문에 테스트 환경에서 사용하는 NetworkManager와 실제 Production 환경에서 사용하는 NetworkManager를 구분해야한다. 이것을 하기 위해 의존성 주입을 해줘야한다.

View Test

view test는 layout test와는 별개로 상태에 따라 UI속성이 변하는 경우에만 그 속성을 테스트하면 된다. 대표적인 예시가 activity indicator인데, isAnimating 속성을 가지고 테스트하는 것이다. 이걸로 연습하다보면 감을 잡기 쉽다.

접근 제한자

private을 사용하게 되면 외부 접근이 불가능하기 때문에 테스트코드 작성이 불가능하다. 그렇다고 풀어서 internal로 쓰자고하니, OOP에 위배가 된다. 어떻게 해야할까?

→ 약간의 trade off가 필요하다. 테스트를 구현하기 위해서는 결국 접근제한자를 internal수준으로 올리고, 다른 방법으로 접근을 제한하도록 생각해봐야한다. 예를 들어, private하게 사용할 녀석은 _를 prefix로 붙여서 서로간의 컨벤션을 정해놓고 해결하는 방법도 있다.

Dummy, Fake, Stub, Spy, Mock

여기까지 내용 Wrap up