本文主要介绍如何对 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
| 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) }
func testState_isLoading() { let reactor = MyReactor() reactor.stub.isEnabled = true
let view = MyView() view.reactor = 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 等, 详见这里.