✅ 이번에는 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
}
}
'Archive > 패캠(초격차)' 카테고리의 다른 글
part5 (ch6). MovieReview 코드리뷰 (0) | 2022.01.31 |
---|---|
part5. (ch6) SwiftLint 알아보기 (0) | 2022.01.17 |
part5. (ch5) BookReview 코드리뷰 (0) | 2022.01.09 |
part5. (ch5) XCTest (0) | 2022.01.09 |
part5. (ch5) forEach를 이용하여 addSubView (0) | 2022.01.07 |