Подмените изменяемое analytics на spy до вызова viewDidLoad и проверьте точный список полученных событий.
Проверка выполнения кода в 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 вручную.