在 Rust 中关于可测试性和发送非发送类型的一个故事

主要观点:探讨 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 原则、类型实现SendSync的不同情况、其他开发者可能引入错误等。
阅读 10
0 条评论