【发布时间】:2018-10-11 13:14:25
【问题描述】:
您好,我正在尝试对位于 Presenter 中的私有函数进行单元测试
这是我的演示者代码,我正在使用网络单例对象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)
}
}
这些是我的演示者和视图。我写了这样的测试代码
首先,我制作了这样的 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
}
}
所以我希望如果我可以用有效 id 和无效来测试 Presenter 的 request(_:) 方法
但是因为request(_:) 没有获取handler 参数并且APIService.shared.fetch 是异步的,所以我无法获取
通过调用request(_:) 得到正确结果。 (总是假的)
如何测试这种 Presenter?
【问题讨论】:
标签: ios swift unit-testing mvp presenter