ReactorKit 代码单元测试

本文最后更新于 2021年4月4日 晚上

本文主要介绍如何对 ReactorKit 客户代码单元测试.

使用 ReactorKit 时候的单元测试可以按如下进行.

1 测什么?

  • View(在 iOS 中通常是 ViewController 作为广义的 View 存在)
    • Action: 是否合适的行为被发送给了 reactor
    • State: 当状态改变后, 视图的属性是否被正确更新
  • Reactor
    • State: 当动作接收到后(输入), 是否正确更新状态(输出).

2 怎么测?

针对 View, 可以使用 stub Reactor, 通过直接手动改变 Reactor 的状态, 来检验视图的属性是否正常改变:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/// 演示外界事件触发动作发送(动作发送的结果是 Reactor 接收到 action, 所以要通过 stub 里面的数据来验证)
func testAction_refresh() {
let reactor = MyReactor()
reactor.stub.isEnabled = true

let view = MyView()
view.reactor = reactor

view.refreshControl.sendActions(for: .valueChanged) // 在代码里面模拟用户行为

XCTAssertEqual(reactor.stub.actions.last, .refresh) // 检验动作是否正确发送
}

/// 演示 Reactor 的状态改变(Reactor 的输出)改变视图的属性, 通过验证属性是否改变来达到目的.
func testState_isLoading() {
let reactor = MyReactor()
reactor.stub.isEnabled = true

let view = MyView()
view.reactor = reactor

// 设置 stub reactor 的属性值改变
reactor.stub.state.value = MyReactor.State(isLoading: true)

// 验证视图属性是否被正确改变
XCTAssertEqual(view.activityIndicator.isAnimating, true)
}

针对 Reactor, 完全可以单独测试(它自己的依赖也可以通过 Mock 或 Stub 来模拟).

1
2
3
4
5
6
7
8
9
10
func testIsBookmarked() {
let reactor = MyReactor()

// 发送动作并验证
reactor.action.onNext(.toggleBookmarked)
XCTAssertEqual(reactor.currentState.isBookmarked, true)

reactor.action.onNext(.toggleBookmarked)
XCTAssertEqual(reactor.currentState.isBookmarked, false)
}

针对更复杂的情况, 就需要使用 Rx 提供的测试工具来完成了, 比如 RxTest 等, 详见这里.


ReactorKit 代码单元测试
https://blog.rayy.top/2020/11/15/2020-11-15-reactorkit-unittest/
作者
貘鸣
发布于
2020年11月15日
许可协议