Лично я бы использовал 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) являются истинными или ложными для ваших ожиданий.