Привет всем, я пытаюсь протестировать один из ViewControllers моего проекта.Этот класс зависит от другого вспомогательного класса, например:
private let dispatcher: Dispatcher = Dispatcher.sharedInstance
private var loginSync = LoginSync.sharedInstance
private var metadataSync = MetadataSync.sharedInstance
Эти вспомогательные классы используются в жизненном цикле UIViewController, например viewDidLoad или viewWillAppear.В моем тесте я создаю экземпляр класса ViewController с помощью класса UIStoryboard, например:
func testSearchBarAddedIntoNavigationViewForiOS11OrMore() {
// Given a YourFlow ViewController embedded in a navigation controller
let mockLoginSync = MockLoginSync()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// Here is too early and view controller is not instantiated yet and I can't assign the mock.
let vc = storyboard.instantiateViewController(withIdentifier: "YourFlow")
// Here is too late and viewDidLoad has already been called so assigning the mock at this point is pointless.
let navigationController = UINavigationController(rootViewController: vc)
// Assertion code
}
Так что моя проблема в том, что мне нужно иметь возможность имитировать класс LoginSync.При обычных обстоятельствах я использовал бы регулярное внедрение зависимостей, передавая эти помощники в качестве аргументов в конструктор класса.В этом случае я не могу этого сделать, потому что я не управляю жизненным циклом View Controller.Поэтому, как только я создаю его экземпляр, помощники уже используются.
Мой вопрос таков: «Существует ли способ внедрения зависимостей для контроллеров View, жизненный цикл которых мы не можем контролировать, или, по крайней мере, обходной путь для него??
Спасибо.
РЕДАКТИРОВАТЬ: Итак, viewDidLoad был вызван, потому что я использовал IBOutlets в переопределенных методах didSet, а не из-за вызова instantiateViewController. Поэтому я могу переместить этот код и выполнить инъекцию послесоздание экземпляра контроллера представления правильно.