Проверка выполнения кода в viewDidLoad()

Подмените изменяемое analytics на spy до вызова viewDidLoad и проверьте точный список полученных событий.

Короткий ответ

Что ответить на собеседовании

Подмените изменяемое analytics на spy до вызова viewDidLoad и проверьте точный список полученных событий.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать unit‑тест, который гарантирует, что при вызове метода viewDidLoad() у экземпляра ViewController будет выполнен вызов метода track у объекта analytics с аргументом "viewController loaded".

class ViewController {
    lazy var analytics: AnalyticsProtocol = Analytics.shared

    func viewDidLoad() {
        analytics.track("viewController loaded")
    }
}

Ответ

Подмените изменяемое analytics на spy до вызова viewDidLoad и проверьте точный список полученных событий.

Если протокол объявляет func track(_ event: String), тест выглядит так:

final class AnalyticsSpy: AnalyticsProtocol {
    var events: [String] = []
    func track(_ event: String) { events.append(event) }
}

func testViewDidLoadTracksEvent() {
    let spy = AnalyticsSpy()
    let controller = ViewController()
    controller.analytics = spy
    controller.viewDidLoad()
    XCTAssertEqual(spy.events, ["viewController loaded"])
}

Метод теста размещается в XCTestCase. Сравнение всего массива проверяет и аргумент, и единственность вызова. В условии это обычный класс; для настоящего UIViewController обычно вызывают loadViewIfNeeded() на main actor, чтобы воспроизвести жизненный цикл, а не дергать viewDidLoad вручную.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее