使使用 RxSwift 进行单元测试更轻松的 Nimble 扩展 🎉
如果您来到这里是为了提供帮助,请查看贡献指南
RxSwift 包含一个非常棒的小型库,称为RxBlocking,它为观察 Observable
实例提供了便捷的功能。 检查是一个阻塞调用,因此得名。
但是编写代码来检查 Observable
的值太无聊了
let result = try! observable.toBlocking().first()
expect(result) == 42
使用 RxNimble
,我们为 Observable
添加了 Nimble 扩展,因此上面的代码可以重写为
expect(observable).first == 42
很好。
也可以将超时传递给阻塞操作符
expect(observable).first(timeout: 3) == 42
此扩展也适用于所有 Traits(例如 Single
,Maybe
)和符合 ObservableConvertibleType
的其他类型。
另一方面,如果您更喜欢使用 RxTest 而不是 RxBlocking
,则可以通过指定 RxNimble 的 RxTest
子规范来实现。 使用 *RxTest*,您可以进行更强大的测试,检查整个流,而不是仅限于 first
,last
和 array
(而后两者隐含地要求流已完成)。
这意味着 *RxTest* 允许您在特定的虚拟时间验证多个 next
,error
和 completed
事件的发生
expect(subject).events(scheduler: scheduler, disposeBag: disposeBag)
.to(equal([
Recorded.next(5, "Hello"),
Recorded.next(10, "World"),
Recorded.completed(100)
]))
您还可以验证特定的错误类型
expect(imageSubject).events(scheduler: scheduler, disposeBag: disposeBag)
.to(equal([
Recorded.error(5, ImageError.invalidImage)
]))
添加到 Podfile 中的测试目标
pod 'RxNimble' # same as RxNimble/RxBlocking
或者
pod 'RxNimble/RxTest' # installs RxTest instead of RxBlocking
甚至
pod 'RxNimble', subspecs: ['RxBlocking', 'RxTest'] # installs both dependencies
然后 pod install
就完成了!
添加到您的 Cartfile.private
github 'RxSwiftCommunity/RxNimble'
运行 carthage update --cache-builds
然后将 Carthage/Builds 文件夹中的以下一个或两个拖放到您的项目中
RxNimbleRxBlocking.framework
和 RxBlocking.framework
RxNimbleRxTest.framework
和 RxTest.framework
已弃用的函数 equalFirst
已被删除,取而代之的是更自然的 Nimble matcher API 风格。
expect(o).to(equalFirst(...))
expect(o).first.to(equal(...))
极少数情况下,Swift 编译器会混淆不同的类型,您需要使用原始的 RxBlocking
代码。
MIT ofc.