Здравствуйте. Я пытаюсь провести модульное тестирование закрытой функции, которая находится в Presenter.
. Это мои коды Presenter, и я использую Networking Singleton Object APIService
class MyPresenter {
weak var vc: MyProtocol?
func attachView(vc: MyProtocol?) {
self.vc = vc
}
func request(_ id: String) {
if id.count == 0 {
vc?.showIDEmptyAlert()
return
}
fetch(id)
}
private func fetch(_ id:String) {
DispatchQueue.global.async {
APIService.shared.fetch(id) { (data, err) in
if let err = err {
self.vc?.showErrorAlert()
return
}
self.vc?.update(data)
}
}
}
}
иэто мои коды ViewController
class MyViewController: UIViewController, MyProtocol {
private var presenter: MyPresenter = MyPresenter()
override func viewDidLoad() {
super.viewDidLoad()
presenter.attachView(vc: self)
}
func showIDEmptyAlert() {
self.present ..
}
func showErrorAlert() {
self.present ..
}
func update(data: String) {
self.label.text = data
}
@IBAction func handleRegisterButton(_ sender: UIButton) {
guard let id = idTextField.text else { return }
presenter.request(id)
}
}
Это мои Presenter и View.И я написал тестовый код следующим образом
Сначала я создал Mock PassiveView следующим образом:
class MyViewMock: MyProtocol {
private (set) var showEmptyIdAlertHasBeenCalled = false
private (set) var showErrorAlertHasBeenCalled = false
private (set) var updateHasBeenCalled = false
func showEmptyIdAlert() {
showEmptyIdAlertHasBeenCalled = true
}
func showErrorAlert() {
showErrorAlertHasBeenCalled = true
}
func update(data: String) {
updateHasBeenCalled = true
}
}
Поэтому я ожидал, что, если я смогу протестировать методы request(_:)
Presenter с действительным идентификатором и недействительным
но поскольку request(_:)
не получил параметр обработчика, а APIService.shared.fetch
асинхронный, я не смог получить правильный результат, вызвав request(_:)
.(Всегда ложно)
Как я могу проверить этот вид Presenter?