Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Я рассказывал о том, как я к этому отношусь (я в настоящее время не определился), но вы можете добавить код в свое приложение, которое читает переменную среды (через 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

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

Ответ 2

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