Archive/패캠(초격차)

part5. (ch5) BookReview XCTest 코드리뷰

lgvv 2022. 1. 9. 22:59

✅ 이번에는 XCTest를 코드리뷰를 해볼 계획이야.

 

✅ 파일구조도

파일구조도

 

🟠 ReviewListPresenterTests.swift

//
//  BookReviewTests.swift
//  BookReviewTests
//
//  Created by Hamlit Jason on 2022/01/07.
//

import XCTest // 테스트 프레임워크를 import
@testable import BookReview // 테스트 대상의 project를 가져오는 코드

class ReviewListPresenterTests: XCTestCase { // 테스트 케이스를 상속 받고
    
    var sut: ReviewListPresenter! // 테스트 대상은 주로 sut을 사용
    
    //var viewController: MockReviewListViewController!
    var viewController: MockReviewListViewController!
    var userDefaultsManager: MockUserDefaultsManager!
    
    override func setUp() { // 함수가 실행될 때 마다 호출
        super.setUp()
        
        viewController = MockReviewListViewController()
        userDefaultsManager = MockUserDefaultsManager() // 초기화 여기서 해주기!
        
        sut = ReviewListPresenter(
            viewController: viewController,
            userDefaultsManager: userDefaultsManager
            //userDefaultsManager: userDefaultsManager
        )
    }
    
    
    override func tearDown() {
        sut = nil
        viewController = nil
        
        super.tearDown()
    }
    
    func test_viewDidLoad가_호출될_때() {
        sut.viewDidLoad()
        
        XCTAssertTrue(viewController.isCalledSetupNavigationBar)
        XCTAssertTrue(viewController.isCalledSetupViews)
        //XCTAssertFalse(viewController.isCalledSetupNavigationBar)
    }
    
    func test_didTapRightButtonItem이_호출될_때() {
        sut.didTapRightBarButtonItem()
        XCTAssert(viewController.isCalledPresentToReviewWriteViewController)
    }
    
    func test_viewWillAppear가_호출될_때() {
        sut.viewWillAppear()
        XCTAssertTrue(userDefaultsManager.isCalledGetReviews)
        XCTAssertTrue(viewController.isCalledReloadTableView)
    }
    
}

 

🟠 MockReviewListViewController.swift

//
//  MockReviewListViewController.swift
//  BookReviewTests
//
//  Created by Hamlit Jason on 2022/01/09.
//

import XCTest
@testable import BookReview

final class MockReviewListViewController: ReviewListProtocol {
    
    var isCalledSetupNavigationBar = false
    var isCalledSetupViews = false
    var isCalledPresentToReviewWriteViewController = false
    var isCalledReloadTableView = false

    func setupNavigationBar() {
        isCalledSetupNavigationBar = true
    }

    func setupViews() {
        isCalledSetupViews = true
    }

    func presentToReviewWriteViewController() {
        isCalledPresentToReviewWriteViewController = true
    }

    func reloadTableView() {
        isCalledReloadTableView = true
    }
}

 

 

🟠 MockUserDefaultManager.swift

//
//  MockUserDefaultManager.swift
//  BookReviewTests
//
//  Created by Hamlit Jason on 2022/01/09.
//

import XCTest
@testable import BookReview

final class MockUserDefaultsManager: UserDefaultsManagerProtocol {
    
    var isCalledGetReviews = false
    var isCalledSetReview = false
    
    func getReviews() -> [BookReview] {
        isCalledGetReviews = true
        
        return []
    }
    
    func setReview(_ newValue: BookReview) {
        isCalledSetReview = true
    }
    
}

여기까지는 특별히 어려운게 없어서.. 쭉 읽어보면 쉽게 이해할 수 있음.

다만 선언부와 init하는 부분만 조금 유심히 보았으면 함.

 

🟠 ReviewWritePresenterTest.swift

//
//  ReviewWritePresenterTests.swift
//  BookReviewTests
//
//  Created by Hamlit Jason on 2022/01/09.
//

import XCTest
@testable import BookReview

class ReviewWritePresenterTest: XCTestCase {
    var sut: ReviewWritePresenter!
    var viewController: MockReviewWriteViewController!
    var userDefaultsManager: MockUserDefaultsManager!

    override func setUp() {
        super.setUp()

        viewController = MockReviewWriteViewController()
        userDefaultsManager = MockUserDefaultsManager()

        sut = ReviewWritePresenter(
            viewController: viewController,
            userDefaultsManager: userDefaultsManager
        )
    }
    
    func test_viewDidLoad가_호출될_때() {
        sut.viewDidLoad()
        
        XCTAssertTrue(viewController.isCalledSetUpNavigationBar)
        XCTAssertTrue(viewController.isCalledSetupViews)
    }
    
    func test_didTapLeftBarButton이_호출될_떄() {
        sut.didTapLeftBarButton()
        
        XCTAssertTrue(viewController.isCalledShowCloseAlertController)
    }
    
    func test_didTapRightBarButton이_호출될_때_book이_존재하고_contentsText가_placeHolder와_같지않게_존재하면() {
        sut.book = Book(title: "Swift", imageURL: "")
        sut.didTapRightBarButton(contentsText: "참 공부하기 좋은 책이에요.")
        
        XCTAssertTrue(userDefaultsManager.isCalledSetReview)
        XCTAssertTrue(viewController.isCalledClose)
    }
    
    func test_didTapRightBarButton이_호출될_때_book이_존재하지_않으면() {
        sut.book = nil
        sut.didTapRightBarButton(contentsText: "참 공부하기 좋은 책이에요.")
        
        XCTAssertFalse(userDefaultsManager.isCalledSetReview)
        XCTAssertFalse(viewController.isCalledClose)
    }
    
    func test_didTapRightBarButton이_호출될_때_book이_존재하고_contentsText가_존재하지_않으면() {
        sut.book = Book(title: "Swift", imageURL: "")
        sut.didTapRightBarButton(contentsText: nil)
        
        XCTAssertFalse(userDefaultsManager.isCalledSetReview)
        XCTAssertFalse(viewController.isCalledClose)
    }
    
    func test_didTapRightBarButton이_호출될_때_book이_존재하고_contentsText가_PlacholerText와_같으면() {
        sut.book = Book(title: "Swift", imageURL: "")
        sut.didTapRightBarButton(contentsText: sut.contentTextViewPlaceHolderText)
        
        XCTAssertFalse(userDefaultsManager.isCalledSetReview)
        XCTAssertFalse(viewController.isCalledClose)
    }
    
    func test_didTapBookTitleButton이_호출될_때() {
        sut.didTapBookTitleButton()
        
        XCTAssertTrue(viewController.isCalledPresentToSearchBookViewController)
    }
}

여기 부분 조금 유심히 봐야하는게, case를 나누어서 테스팅 하는게 상당히 인상깊다!

 

 

🟠 MockReviewWirtePresenterTest.swift

//
//  MockReviewWirtePresenterTest.swift
//  BookReviewTests
//
//  Created by Hamlit Jason on 2022/01/09.
//

import XCTest
@testable import BookReview

class MockReviewWirtePresenterTest: XCTestCase {
    
}

final class MockReviewWriteViewController: ReviewWriteProtocol {
    
    var isCalledSetUpNavigationBar = false
    var isCalledShowCloseAlertController = false
    var isCalledClose = false
    var isCalledSetupViews = false
    var isCalledPresentToSearchBookViewController = false
    var isCalledupdateViews = false
    
    
    func setUpNavigationBar() {
        isCalledSetUpNavigationBar = true
    }
    
    func showCloseAlertController() {
        isCalledShowCloseAlertController = true
    }
    
    func close() {
        isCalledClose = true
    }
    
    func setupViews() {
        isCalledSetupViews = true
    }
    
    func presentToSearchBookViewController() {
        isCalledPresentToSearchBookViewController = true
    }
    
    func updateViews(title: String, imageURL: URL?) {
        isCalledupdateViews = true
    }
    
    
}