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