用#![no_std]测试板条箱

Zac*_*ith 4 testing rust

我正在为Rust中的编程语言实现编写运行时.我打算在这个运行时链接我生成的编译代码,所以我不想依赖于std保持二进制小.问题是,当我尝试cargo test我的运行时,我得到错误说std::slice::AsSlice无法找到,我发现一些谷歌搜索之后是因为一些测试工具需要std库代码.

有没有人对如何测试此代码有任何建议?有没有办法有条件地包含#![no_std]pragma,即在测试时仍然包含std库?我还尝试创建一个单独的测试包,其中包含std库,extern crate将运行时包放入其中并在那里运行我的测试,但这引入了一组全新的问题.

小智 28

您可以通过 cfg_attr 有条件地设置 no_std。

#![cfg_attr(not(test), no_std)]
Run Code Online (Sandbox Code Playgroud)

  • 这是 2022 年更好的答案,特别是考虑到 extern crate 是不必要的。 (5认同)

Chr*_*gan 8

#[cfg(test)]
#[macro_use]
extern crate std;
Run Code Online (Sandbox Code Playgroud)

(该#[macro_use]部分是可选的.)

  • 如果你将其设置为无条件的“extern crate std;”,那么你就失去了“#![no_std]”的全部意义。在这种情况下,您应该提供自己的模块 std,如下所示: `mod std { pub use core::cmp; }` (2认同)