Да, есть способ добиться этого, я использую его и в своих тестах.
Вы должны поговорить со своим приложением, используя launchArguments
(или, в конечном итоге, launchEnvironment
). Во-первых, в своем методе setUp()
сообщите приложению, что оно находится в режиме UI-TESTING
:
override func setUp() {
super.setUp()
continueAfterFailure = true
app.launchArguments += ["UI-TESTING"]
}
Затем в каждом тесте, в котором вы ожидаете выхода из системы, сообщайте вашему приложению, что оно должно выйти из системы, прежде чем вызывать XCUIApplication.launch()
метод:
let app = XCUIApplication()
func testWithLoggedOutUser() {
app.launchArguments += ["logout"]
app.launch()
// Continue with the test
}
Затем в файле AppDelegate.swift
прочитайте аргументы и действуйте соответственно:
class AppDelegate: UIResponder, UIApplicationDelegate {
static var isUiTestingEnabled: Bool {
get {
return ProcessInfo.processInfo.arguments.contains("UI-TESTING")
}
}
var shouldLogout: Bool {
get {
return ProcessInfo.processInfo.arguments.contains("logout")
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if AppDelegate.isUiTestingEnabled {
if shouldLogout {
// Call synchronous logout method from your app
// or delete user data here
}
}
}
}
Я написал пост в блоге о настройке локального состояния в приложении, вы можете проверить его здесь .