Тестирование userDefaults и приватной функции - PullRequest
0 голосов
/ 28 ноября 2018

Я использую Coordinator шаблон для обработки ViewControllers.

В моем appCoordinator я установил rootViewController в состоянии входа пользователя.

protocol Coordinatorbale {
    func coordinate()
}


class AppCoordinator: Coordinatorbale {
    init(){ .... }

    func coordinate() {
       let logedIn = UserDefaults.standard.bool(forKey: "user_logged_in")

        if logedIn {
            window.rootViewController = V1
        else {
            window.rootViewController = V2
        }
    }

}

Как я могу это проверить?

Если я возьму логику из функции coordinate.Новое развлечение будет приватным, и тогда я все еще не могу проверить состояние.

private func setRootByUserState(logedIn: Bool) {
    if logedIn {
            window.rootViewController = V1
        else {
            window.rootViewController = V2
        }
}

Так что я застрял с методом private или UserDefaults.

Как я могуМодульное тестирование этого поведения?

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете обернуть 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
}

Обратите внимание, я не рядом с компилятором (ужасная мысль, верно :)), поэтому я неПротестировал вышесказанное на предмет синтаксических ошибок, но, надеюсь, вы поняли идею, и, надеюсь, вам это пригодится.

...