Swift Combine 使用从 PassthroughSubject 预定好的发送的事件测试订阅者 从入门到精通二十三

本文主要是介绍Swift Combine 使用从 PassthroughSubject 预定好的发送的事件测试订阅者 从入门到精通二十三,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Combine 系列

  1. Swift Combine 从入门到精通一
  2. Swift Combine 发布者订阅者操作者 从入门到精通二
  3. Swift Combine 管道 从入门到精通三
  4. Swift Combine 发布者publisher的生命周期 从入门到精通四
  5. Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
  6. Swift Combine 订阅者Subscriber的生命周期 从入门到精通六
  7. Swift 使用 Combine 进行开发 从入门到精通七
  8. Swift 使用 Combine 管道和线程进行开发 从入门到精通八
  9. Swift Combine 使用 sink, assign 创建一个订阅者 从入门到精通九
  10. Swift Combine 使用 dataTaskPublisher 发起网络请求 从入门到精通十
  11. Swift Combine 用 Future 来封装异步请求 从入门到精通十一
  12. Swift Combine 有序的异步操作 从入门到精通十二
  13. Swift Combine 使用 flatMap 和 catch错误处理 从入门到精通十三
  14. Swift Combine 网络受限时从备用 URL 请求数据 从入门到精通十四
  15. Swift Combine 通过用户输入更新声明式 UI 从入门到精通十五
  16. Swift Combine 级联多个 UI 更新,包括网络请求 从入门到精通十六
  17. Swift Combine 合并多个管道以更新 UI 元素 从入门到精通十七
  18. Swift Combine 通过包装基于 delegate 的 API 创建重复发布者 从入门到精通十八
  19. Swift Combine 响应NotificationCenter 的更新 从入门到精通十九
  20. Swift Combine 使用 ObservableObject 与 SwiftUI 模型作为发布源 从入门到精通二十
  21. Swift Combine 使用 XCTestExpectation 测试发布者 从入门到精通二十一
  22. Swift Combine 使用 PassthroughSubject 测试订阅者 从入门到精通二十二
    在这里插入图片描述

1. 使用从 PassthroughSubject 预定好的发送的事件测试订阅者

目的:当你想要测试的是管道的时序时,用于测试管道或订阅者。

在 Combine 中有许多针对数据时序的操作符,包括 debouncethrottle 以及 delay。 在进行 UI 测试之外,你可能需要测试你的管道时序具有所需的效果。

实现这个的方法之一是利用 XCTestExpectationpassthroughSubject,将两者结合起来。 基于 使用 XCTestExpectation 测试发布者 和 使用 PassthroughSubject 测试订阅者,在测试中添加 DispatchQueue,以安排 PassthroughSubject.send() 方法的调用。

一个这种用法的例子:

UsingCombineTests/PublisherTests.swift - testKVOPublisher

func testKVOPublisher() {let expectation = XCTestExpectation(description: self.debugDescription)let foo = KVOAbleNSObject()let q = DispatchQueue(label: self.debugDescription)   // 1let _ = foo.publisher(for: \.intValue).print().sink { someValue inprint("value of intValue updated to: >>\(someValue)<<")}q.asyncAfter(deadline: .now() + 0.5, execute: {  // 2print("Updating to foo.intValue on background queue")foo.intValue = 5expectation.fulfill()  // 3})wait(for: [expectation], timeout: 5.0)  // 4
}
  1. 这将为你的测试添加 DispatchQueue,并以测试的描述 debugDescription 来命名该队列。 这只在调试中测试失败时显示,并且在还有其它后台线程也在使用时,方便地提醒测试代码中发生了什么情况。
  2. .asyncAfter 和参数 deadline 一起使用,用来定义何时发起请求.
  3. 这是将任何相关的断言嵌入到订阅者或其周围的最简单的方式。此外,将 .fulfill() 作为你发送队列的最后一个条目,好让测试知道它现在已完成。
  4. 请确保当你设置等待超时时间时,有足够的时间让你的队列被调用。

此技术的一个明显缺点是,它使得测试花费的最短时间至少是测试中的最大的队列延迟。

另一种选择是第三方库,名为 EntwineTest,开发灵感来自 RxTest 库。 EntwineTestEntwine 的一部分,一个提供了一些 helpers 扩展了 Combine 的 Swift 库。 该库可以在 github 上找到,位于 https://github.com/tcldr/Entwine.git,只要使用时遵守 MIT 证书即可。

EntwineTest 中包含的关键元素之一是虚拟时间调度器,以及使用此调度器时安排(TestablePublisher)并收集和记录(TestableSubscriber)结果时间的其他类。

来自 EntwineTest 工程的 README 中的一个例子包含在:

UsingCombineTests/EntwineTestExampleTests.swift - testExampleUsingVirtualTimeScheduler

func testExampleUsingVirtualTimeScheduler() {let scheduler = TestScheduler(initialClock: 0)  // 1var didSink = falselet cancellable = Just(1)  // 2.delay(for: 1, scheduler: scheduler).sink { _ indidSink = true}XCTAssertNotNil(cancellable)// where a real scheduler would have triggered when .sink() was invoked// the virtual time scheduler requires resume() to commence and runs to// completion.scheduler.resume()  // 3XCTAssertTrue(didSink)  // 4
}
  1. 使用虚拟时间调度器需要在测试开始时创建一个,将其时钟初始化为起始值。 EntwineTest 中的虚拟时间调度器将以 200 的值开始订阅,如果管道在时间为 900 时还没完成,则会超时。
  2. 你和以往创建任何发布者或订阅者一样,创建你的管道。 EntwineTest 还提供可测试的发布者和订阅者,以供使用。 有关 EntwineTest 这些部分的更多详细信息,请看 使用 EntwineTest 创建可测试的发布器和订阅者.
  3. .resume() 需要在虚拟时间调度器上调用,以开始其工作和触发管道运行。
  4. 在管道运行到完成后,对预期的最终结果进行断言。

参考

https://heckj.github.io/swiftui-notes/index_zh-CN.html

代码

https://github.com/heckj/swiftui-notes

这篇关于Swift Combine 使用从 PassthroughSubject 预定好的发送的事件测试订阅者 从入门到精通二十三的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726794

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件