Как проверить, отклонен ли контроллер представления или выскочил - PullRequest
0 голосов
/ 29 января 2019

Я хочу написать модульный тест для своей функции, вот код:

  func smartBack(animated: Bool = true) {
    if isModal() {
      self.dismiss(animated: animated, completion: nil)
    } else {
      self.navigationController?.popViewController(animated: animated)
    }
  }

Этот метод автоматически выбирает dismiss или pop.Итак, как я могу проверить, появился ли viewcontroller после этой функции?Спасибо за помощь

Ответы [ 4 ]

0 голосов
/ 29 января 2019

Лично я бы использовал Mocks для отслеживания вызова определенных методов.

Вы можете сделать это следующим образом:

class MockNavigationController: UINavigationController {

    var _popCalled: Bool = false
    override func popViewController(animated: Bool) -> UIViewController? {
        _popCalled = true
        return self.viewControllers.first
    }
}

Тогда каждый раз, когда ваш код вызывает popViewController, значение _popCalled будет обновляться, но на самом деле ничего не будет выдвигаться.Таким образом, вы можете установить значение _popCalled, чтобы убедиться, что ожидаемый вызов произошел.

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

Хотя сначала их может быть сложно понять.Я бы посоветовал прочитать их перед интенсивным использованием.

Полный пример игровой площадки:

import UIKit
import PlaygroundSupport
import MapKit

class ClassUnderTest: UIViewController {
    var isModal: Bool = false

    func smartBack(animated: Bool = true) {
        if isModal {
            self.dismiss(animated: animated, completion: nil)
        } else {
            self.navigationController?.popViewController(animated: animated)
        }
    }
}

class MockNavigationController: UINavigationController {

    var _popCalled: Bool = false
    override func popViewController(animated: Bool) -> UIViewController? {
        _popCalled = true
        return self.viewControllers.first
    }
}

class MockClassUnderTest: ClassUnderTest {

    var _mockNavigationController = MockNavigationController()
    override var navigationController: UINavigationController? {
        return _mockNavigationController 
    }

    var _dismissCalled: Bool = false
    override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
        _dismissCalled = true
    }

}

var subject = MockClassUnderTest()
subject.isModal = true
subject.smartBack();
var navigation = subject.navigationController as! MockNavigationController

print(subject._dismissCalled)
print(navigation._popCalled)

ВЫХОД :

true
false

subject = MockClassUnderTest();
subject.isModal = false
subject.smartBack();
navigation = subject.navigationController as! MockNavigationController

print(subject._dismissCalled)
print(navigation._popCalled)

OUTPUT :

false
true

В этом примере вы переопределяете методы dismiss и pop, которые будутназывается в любом случае.В своем модульном тесте вы просто подтвердите, что значения-заглушки (_popCalled) являются истинными или ложными для ваших ожиданий.

0 голосов
/ 29 января 2019

Вы можете проверить стек viewControllers и посмотреть, включен ли ваш viewController, используя:

self.navigationController.viewControllers

Это вернет [UIViewController], содержащийся в стеке navigationController.

0 голосов
/ 29 января 2019

Вы можете проверить свойство isBeingDismissed контроллера представления в его viewWillAppear или viewDidAppear функции.

См. https://developer.apple.com/documentation/uikit/uiviewcontroller/2097562-isbeingdismissed.

0 голосов
/ 29 января 2019

Вы можете использовать свойство self.isBeingPresented , вернет true, если контроллер представления представлен иначе, false при нажатии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...