Синглтон на основе классов - это то, что нужно, при условии, что вы приспособитесь к внедрению зависимостей для своих тестов.Способ сделать это - создать отдельный синглтон для вашего приложения, который называется, скажем, DependencyManager.В вашем AppDelegate (или из других классов, если необходимо) вы создадите все контроллеры, сетевые службы, модели областей и т. Д., Которые вы хотите повесить на свой DependencyManager, а затем назначите их DependencyManager.Этот код будет пропущен вашими модульными тестами.
После этого ваши модульные тесты смогут получить доступ к DependencyManager (и, таким образом, создать экземпляр DependencyManager при первом доступе) и заполнить его фиктивными версиями этих контроллеров и служб в любой степени,модульный тест желает.
Ваши UIViewControllers, ваши модели MVVM-представления и т. д. могут обращаться к DependencyManager как к одиночке и, таким образом, получать либо реальные контроллеры и сервисы, либо фиктивную их версию, в зависимости от того,вы запускаете приложение или модульные тесты.
Если вы работаете с MVVM, я также рекомендую, чтобы когда UIViewController собирался создать свой класс модели представления, он сначала проверял специальное свойство в DependencyManager, чтобыпосмотрите, существует ли mockViewModel.Одно свойство может служить этой цели, так как только один из ваших UIViewControllers когда-либо будет проверен одновременно.Это свойство будет использоваться вместо создания новой модели представления для себя.Таким образом, вы можете смоделировать свои модели представлений при тестировании каждого UIViewController.(Существуют и другие приемы, связанные с возможностью поддержки одного UIViewController для тестирования, но я не буду здесь это освещать).
Обратите внимание, что все вышеперечисленное может очень хорошо работать с приложением, которое также хочетиспользуйте раскадровки и / или перья.Люди так расстроены из-за раскадровки, что не могут понять, как внедрить зависимости в макетные сервисы для своих контроллеров представлений.Что ж, решение выше!Просто убедитесь, что в вашем AppDelegate загружена раскадровка ПОСЛЕ настройки DependencyManager.(Удалите название раскадровки из вашего info.plist и создайте его самостоятельно в AppDelegate.),Я очень рекомендую подход!И обязательно напишите свои модульные тесты и тесты viewController либо во время, либо хотя бы сразу после разработки каждого такого класса, либо вы никогда не сможете их обойти!