Издевательские объекты с автоматизацией пользовательского интерфейса Xcode 7

Я использовал KIF Framework до сих пор для iOS UI Automation. Цели KIF (также Unit Test) запускают код тестирования Unit / UI в том же процессе, в котором работает ваше приложение, и мы можем легко размахивать различными объектами / классами, используемыми приложением, чтобы показать макет данных.

При переключении на новую автоматизацию пользовательского интерфейса на основе Xcode 7 я обнаружил, что цель тестирования модуля UI работает в отдельном процессе и запускает приложение в отдельном процессе. И таким образом, невозможно получить доступ к классам / объектам App через модульные тесты и издеваться над ними.

Кто-нибудь сталкивался с той же проблемой и знал о каком-либо обходном пути?

Пожалуйста, дайте мне знать, если вам нужна более подробная информация.

Ответ: см. Подробный ответ ниже. Также здесь есть ссылка на ответ от Apple devs: https://forums.developer.apple.com/thread/23552

Поскольку вы работаете в другом процессе, на самом деле на самом деле нет способа вводить mocks в ваше приложение через ваши тесты. Сказав это, вы можете контролировать процесс своего приложения и, таким образом, можете влиять на него.

Я пошел туда и обратно о том, как я к этому отношусь (в настоящее время я не уверен), но вы можете добавить код в свое приложение, которое считывает переменную среды (через NSProcessInfo ), которая заставляет приложение вести себя по-другому (т. NSProcessInfo Изменять что ваша инъекция зависимости вводится в ваш класс, поэтому он использует mocks).

Недостатком этого является то, что макет кода не содержится строго в тестовом комплекте, и вы получаете этот код в своем приложении (если вы не используете операторы #if для его изоляции). Очевидно, что также важно быть осторожным с разветвлением кода, поэтому вы не делаете недействительным тестирование.

Вы можете настроить переменную окружения перед запуском приложения в своем тесте пользовательского интерфейса:

 let app = XCUIApplication() app.launchEnvironment = ["UITestUseMocks" : "true"] app.launch() 

Затем в вашем приложении вы можете проверить это, возможно, в инструкции #if и изменить свое поведение:

 #if TEST_TARGET if let useMocks = NSProcessInfo().environment["UITestUseMocks"] where useMocks == "true" { // Alter services used in dependency injection or some other testing behavior } #endif 

Я рассматривал этот подход для реализации уровня макетного сервиса, который просто воспроизводит некоторые ответы на консервированные серверы, поэтому я могу настроить тесты на пользовательский интерфейс, не зависящие от ответов сервера (в любом случае, тестирование на сервере).

Я использую эту библиотеку для насмешек в IOS и очень хорошо работает на Xcode 7. http://ocmock.org/ios/

Давайте будем гением компьютера.