ios - 使用 RxSwift、TDD 和 MVVM 以编程方式实现 UIButton

标签 ios swift mvvm tdd rx-swift

我尝试使用 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/

相关文章:

ios - Touch drag enter 如何工作?

iOS - 图标在启动时拉伸(stretch)

ios - 在 iOS 13 中,从呈现模式中拉动刷新表格 View 不起作用

ios - 如何在 Swift 中仅在 View Controller 的一部分上实现滑入/滑出菜单?

ios - 如何处理 Swift 中缺少反射的问题?

ios - 从通知打开应用程序时显示特定选项卡

ios - 等同于 [NSTimeZone timeZone With Abbreviation : @"GMT"] in swift

c# - 带 MVVM 的 WPF 数据网格

c# - 如何处理检索 i2c 缓冲区和设置模型/实体属性?

c# - 工作 MvvM 和并发