[iOS, Swift] 단위 테스트 중에 언제든지 ViewDidLoad(), ViewWill(Did)Appear(), ViewWill(Did)Disappear()를 호출하는 방법

잊기 쉽기 때문에 비망도 겸해 정리해 둡니다.

사전 준비



다음과 같은 View Controller(Initial View Controller)를 작성합니다.

HogeViewController.swift

import UIKit

class HogeViewController: UIViewController {

    // ViewDidLoad()用フラグ
    var isViewDidLoadCalled = false

    // ViewWill(Did)Appear()用フラグ
    var isViewWillAppearCalled = false
    var isViewDidAppearCalled = false

    // ViewWill(Did)Disappear()用フラグ
    var isViewWillDisappearCalled = false
    var isViewDidDisappearCalled = false

    // MARK: - View Controller Lifecycle Methods
    override func viewDidLoad() {
        super.viewDidLoad()
        self.isViewDidLoadCalled = true
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.isViewWillAppearCalled = true
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.isViewDidAppearCalled = true
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.isViewWillDisappearCalled = true
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.isViewDidDisappearCalled = true
    }
}


그런 다음 이 View Controller를 테스트하는 파일을 만들고 다음과 같은 설정을 수행합니다.

HogeViewControllerTests.swift

import XCTest
@testable import InvokeVCLifecycleMethods

class HogeViewControllerTests: XCTestCase {

    var hogeVC: HogeViewController!

    override func setUp() {
        super.setUp()

        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        hogeVC = storyboard.instantiateInitialViewController() as! HogeViewController
    }

    override func tearDown() {
        super.tearDown()
    }

    func test_ViewDidLoad_Called() {
        XCTAssertTrue(hogeVC.isViewDidLoadCalled)
    }

    func test_ViewWillAndDidAppear_Called() {
        XCTAssertTrue(hogeVC.isViewWillAppearCalled)
        XCTAssertTrue(hogeVC.isViewDidAppearCalled)
    }

    func test_ViewWillAndDidDisappear_Called() {
        XCTAssertTrue(hogeVC.isViewWillDisappearCalled)
        XCTAssertTrue(hogeVC.isViewDidDisappearCalled)
    }

}


이 상태에서 테스트를 실행하면 모든 테스트가 실패합니다.



이것으로 사전 준비가 완료됩니다.

View Controller LifeCycle 메서드 호출



그럼 조속히, 각종 메소드를 호출해 갑시다.

ViewDidLoad()



ViewDidLoad()는 View Controller의 view 속성에 액세스하여 호출할 수 있습니다.

[추기] ㅎㅎㅎ 씨로부터 view 에의 액세스가 아니라 loadViewIfNeeded()ViewDidLoad() 를 호출하는 방법을 가르쳐 주셨습니다. 감사합니다!
    func test_ViewDidLoad_Called() {
        // ViewDidLoad()を呼び出す
        hogeVC.loadViewIfNeeded()

        XCTAssertTrue(hogeVC.isViewDidLoadCalled)
    }

결과



Pass했습니다.

ViewWill(Did)Appear()


ViewWillAppear() 는 UIViewController 에 beginAppearanceTransition(_:animated:) 이라는 인스턴스 메소드가 준비되어 있으며, 그 첫 번째 인수( _ isAppearing: Bool )를 true 로 호출하여 호출할 수 있습니다. ViewDidAppear() 는, 그 인스턴스 메소드를 호출한 후에 endAppearanceTransition() 를 호출하는 것으로 호출할 수 있습니다.
        // ViewWillAppear()を呼び出す(第一引数をtrueにする)
        hogeVC.beginAppearanceTransition(true, animated: false)
        // ViewDidAppear()を呼び出す
        hogeVC.endAppearanceTransition()

결과



이것도 Pass했습니다.

ViewWill(Did)Disappear()


ViewWillDisappear()는 이전 beginAppearanceTransition(_:animated:)의 첫 번째 인수 ( _ isAppearing: Bool )를 false로 호출하여 호출 할 수 있습니다. ViewDidDisappear()endAppearanceTransition()을 호출하여 호출 할 수 있습니다.
    func test_ViewWillAndDidDisappear_Called() {
        // ViewWillDisappear()を呼び出す(第一引数をfalseにする)
        hogeVC.beginAppearanceTransition(false, animated: false)
        // ViewDidDisappear()を呼び出す
        hogeVC.endAppearanceTransition()

        XCTAssertTrue(hogeVC.isViewWillDisappearCalled)
        XCTAssertTrue(hogeVC.isViewDidDisappearCalled)
    }

결과



모두 Pass했습니다.

유닛 테스트를 작성할 때 활용하십시오.

참고



Work with View Controllers
htps : //로 ゔぇぺぺr. 아 ぇ. 코 m / ぃ b 등 ry / 혼텐 t / 레후 렌세 ぃ b 등 ry / 갓찐 gS 타 d / ゔ ぇw 콘 t 롯 rs. HTML )

[추기] loadViewIfNeeded()
htps : //로 ゔぇぺぺr. 아 ぇ. 코 m / 도쿠 멘 타치 온 / 우이 키 t / 우이 우에 w t t ro r / 1621446

beginAppearanceTransition(_:animated:)
htps : //로 ゔぇぺぺr. 아 ぇ. 코 m / 도쿠 멘 타치 온 / 우이 키 t / 우이 우에 w t t 로페 r / 1621387

endAppearanceTransition()
htps : //로 ゔぇぺぺr. 아 ぇ. 코 m / 도쿠 멘 타치 온 / 우이 키 t / 우이 우에 w t t 로페 r / 1621503

iOS: The One Weird Trick For Testing View Controllers in Swift

Testing in Swift

좋은 웹페이지 즐겨찾기