我尝试使用 RxSwift 以编程方式实现 UIButton,我搜索了很多但没有找到任何有用的东西,因为我是这个主题的新手,我脑子里有一些问题
我有一个带有两个按钮的 View ,注册和登录,通过点击这个按钮,唯一的 Action 是推送到一个新的 ViewController,这里是 LoginViewController 的代码(我知道我不应该实现任何代码,除非测试失败通过,它只是为了展示我到底想做什么):
import UIKit
import RxCocoa
import RxSwift
class LoginViewController: UIViewController {
let disposeBag = DisposeBag()
var loginButton: UIButton?
var registerButton: UIButton?
override func viewDidLoad() {
super.viewDidLoad()
loginButton = UIButton()
registerButton = UIButton()
view.addSubview(loginButton!)
loginButton?.rx.tap
.subscribe(onNext:{ [weak self] in
let enterPhoneNumberVC = EnterPhoneNumberViewController(nibName: "EnterPhoneNumberViewController", bundle: nil) as EnterPhoneNumberViewController
self?.navigationController?.pushViewController(enterPhoneNumberVC, animated: true)
})
.disposed(by: disposeBag)
}
}
问题1:据我了解,没有必要通知viewModel,因为按钮 Action 没有逻辑,对吗?还是我应该通过 View 模型处理它?</p>
问题 2:由于这是一个 TDD 项目,我应该如何测试下面提到的功能:
检查点击是否在 ViewController 中处理
测试触摸按钮是否真的如我所愿
谢谢。
最佳答案
回答 1: 我想说,如果没有逻辑,那么就没有理由测试,也不需要通过 View 模型运行代码。也就是说,在您发布的示例中,是 逻辑。你的闭包中的每一个 ?
都代表一个 if 检查,如果检查是逻辑的。如果 LoginViewController 被呈现而不是推送到导航 Controller 上怎么办?对这个问题的常见回答是,“好吧,我知道它没有出现。我知道导航 Controller 存在。”问题是我知道的部分。
我在这里的首选方法是将按钮点击路由到可以推送到导航 Controller 上的东西, 不必检查它是否存在。这样就没有问题(双关语意)它的存在。
答案 2: 您提到的两个功能都是副作用,需要集成测试,而不是单元测试。您可以使用 UI 测试来测试此类功能。
关于ios - 使用 RxSwift、TDD 和 MVVM 以编程方式实现 UIButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54886945/