Как импортировать мой модуль приложения в файл MyAppUITests?

Это мой простой тестовый пример:

import XCTest
@testable import MyApp //it doesn't work

из-за этого:

введите здесь описание изображения

class TabBarControllerTests: XCTestCase {

    override func setUp() {
        super.setUp()

        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject([], forKey: DBTabBarOrderedIndexesKey) //key is undefined, because of lack of my app module
        defaults.synchronize()

        continueAfterFailure = false
        XCUIApplication().launch()
    }

    func testIsOrderOfTabsSaved() {

        XCUIApplication().tabBars.buttons["Catering"].tap()
        //what next?
    }
}

Как только я нажимаю UITabBarItem, я изменяю значение DBAppSettings.mode, поэтому здесь я хотел бы иметь доступ к моему свойству DBAppSettings.mode, чтобы проверить, действительно ли оно изменилось.

Я заметил одну странную вещь: когда я собираю свое приложение и проверяю, что было построено, нет сборки для моей цели UITest. Это важно?

введите здесь описание изображения


person Bartłomiej Semańczyk    schedule 02.08.2015    source источник


Ответы (5)


Это ответ от Apple:

Тесты пользовательского интерфейса выполняются иначе, чем модульные тесты. Модульные тесты выполняются внутри процесса вашего приложения, поэтому они могут получить доступ к вашему коду приложения. Тесты пользовательского интерфейса выполняются в отдельном процессе вне вашего приложения, поэтому они могут имитировать взаимодействие пользователя с приложением. Не ожидается, что вы сможете получить доступ к своему классу приложения из теста пользовательского интерфейса.

person Bartłomiej Semańczyk    schedule 16.08.2015

Каждый объект, к которому вам нужен доступ в тестах пользовательского интерфейса, должен быть частью цели теста пользовательского интерфейса. Это включает зависимости объектов. Это скользкий путь, а скорее беспорядок.

person Jereme    schedule 19.09.2015

Вместо того, чтобы ваши тесты знали о вашем приложении, попробуйте изменить его и дать вашему приложению знать, что оно тестируется. Один из способов — использовать свойство launchArguments:

    app = XCUIApplication()
    app.launchArguments.append("TestMode")
    app.launch()

Затем в вашем приложении:

    if NSProcessInfo.processInfo().arguments.contains("TestMode") {
        // I am running in test mode
    }

В вашем случае приложение может соответствующим образом установить NSUserDefaults.

person Michael    schedule 26.12.2015

Поскольку Apple не позволяет вам получить доступ к вашему основному приложению из тестов пользовательского интерфейса, вы можете подумать о реорганизации структуры вашего приложения для хранения соответствующих данных, которые необходимо проверить, в месте, доступном для тестов пользовательского интерфейса.

Вы можете рассмотреть возможность переноса определений и данных из основного класса приложения в отдельный класс, который может быть загружен тестовой средой.

person rholmes    schedule 23.08.2015
comment
Это не очень хорошая идея, так как мне нужен доступ к моему приложению, а не к некоторым классам. Речь идет о простом случае с key, а в общем мне нужен доступ к некоторым синглтонам. - person Bartłomiej Semańczyk; 24.08.2015
comment
Обычно я помещаю синглтоны в их собственные классы, внешние по отношению к общему экземпляру приложения. Подойдет ли это для вашей цели? - person rholmes; 24.08.2015
comment
будет работать, но объекты в этих синглтонах - это другие объекты из моего класса, поэтому в основном мне нужно будет прикрепить к тестовой цели каждый файл из моей цели приложения :-) это не ожидается... - person Bartłomiej Semańczyk; 24.08.2015
comment
@BartłomiejSemańczyk, вы смогли найти решение для доступа к синглтону в файле UITest? - person Satish Mavani; 13.05.2020

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

Что касается доступа к фактической памяти исполняемого файла, вы не можете, но вы можете проверить вещи, которые должны появиться на экране где-то в этом режиме. Я использую это утверждение, например. проверить наличие ячейки табличного представления:

XCTAssertTrue(tables.cells.staticTexts["Cell title I expect to exist"].waitForExistence(timeout: 1))

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

Я тоже использую аргументы запуска для настройки своего приложения для тестов пользовательского интерфейса, как предложил Майкл: https://stackoverflow.com/a/34469136/4789448.

person sixstringtheory    schedule 02.12.2017