主要观点:探讨 Rust 中可测试性、多线程以及如何发送!Send
类型的问题,通过示例代码展示不同方法的尝试与限制,强调测试的重要性及良好设计的意义。
关键信息:
- 代码中通过
spawn_thread
函数创建线程并播放音频,存在可测试性问题,需依赖接口而非具体类型进行测试。 - 若要使代码可测试,可采用依赖反转,定义
Audio
trait 抽象音频后端行为,但会遇到类型不是Send
或'static
的问题。 - 手动实现
Send
需谨慎,若编译器不自动实现Send
可能有原因,直接覆盖可能不安全。 Mutex<T>
和Arc<Mutex<T>>
不能将非Send
类型变为Send
类型。- 搜索 crates.io 未找到合适的用于处理非
Send
类型Send
包装的 crate,后有 fellow Rustacean 指出diplomatic-bag
crate 可实现,但有注意事项。 - 应将测试项视为黑盒,测试
spawn_thread
而非用execute_thread
替代,这样可捕获更高层的错误,且使spawn_thread
可测试能带来更好设计。 - 可通过创建 API 注入创建实例的代码来解决
spawn_thread
不可测试的问题,虽会有构造函数失败的问题但可处理。
重要细节: - 给出了
spawn_thread
函数的不同实现方式及相关代码示例,如传递默认构造函数、返回模拟后端的可调用对象、传递配置等。 - 对各个 endnote 进行了详细解释,如关于 SOLID 原则、类型实现
Send
和Sync
的不同情况、其他开发者可能引入错误等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。