Вы можете обернуть UserDefaults
за протокол.
protocol PreferenceAware {
var isLoggedIn: Bool { get set }
}
И затем другой класс соответствует этому protocol
struct UserDefaultsPreferences: PreferenceAware {
private let userLoggedInKey = "user_logged_in"
get {
return UserDefaults.standard.bool(forKey: userLoggedInKey)
}
set {
UserDefaults.standard.set(newValue, forKey: userLoggedInKey)
}
}
Ваш AppDelegate
тогда имеетпеременная типа PreferenceAware
примерно так:
var prefenceContainer: PreferenceAware = UserDefaultsPreferences()
И вы используете это в своем методе примерно так:
func coordinate() {
let loggedIn = preferenceContainer.isLoggedIn
if loggedIn {
window.rootViewController = V1
else {
window.rootViewController = V2
}
}
Теперь для тестирования вы можете создать тестовый объект, соответствующийPreferenceAware
, обновите свой preferenceContainer
в AppDelegate
и управляйте им, как считаете нужным.
struct MockPreferenceAware: PreferenceAware {
var isLoggedIn: Bool
}
Позволяет вам сделать что-то подобное в своем тесте:
func testLoggedIn() {
let mock = MockPreferenceAware(isLoggedIn: true)
appDelegate.preferenceContainer = mock
//now you are sure of the path that your code will follow in the coordinate method
}
И вы также можете проверить поток, когда пользователь не вошел в систему:
func testNotLoggedIn() {
let mock = MockPreferenceAware(isLoggedIn: false)
appDelegate.preferenceContainer = mock
//now you are sure of the path that your code will follow in the coordinate method
}
Обратите внимание, я не рядом с компилятором (ужасная мысль, верно :)), поэтому я неПротестировал вышесказанное на предмет синтаксических ошибок, но, надеюсь, вы поняли идею, и, надеюсь, вам это пригодится.