我正在尝试使用条件编译语句。除了定义一个只应存在于调试版本中的函数之外,我想定义一组仅存在于调试版本中的变量/常量/类型。
#[cfg(debug)]
pub type A = B;
pub type B = W;
#[cfg(other_option)]
pub type A = Z;
pub type B = I;
let test = 23i32;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,条件编译属性实际上“覆盖”了多少行?它只有一个(在这种情况下我会期望什么)?有没有办法确保整个代码块(包括变量、类型和两个函数)都被条件覆盖?
我目前正在构建一个严重依赖文件 IO 的应用程序,所以很明显我的代码的很多部分都有File::open(file).
做一些集成测试没问题,我可以轻松设置文件夹来加载它所需的文件和场景。
问题出现在我想要进行单元测试和代码分支的任何地方。我知道有很多模拟库声称可以模拟,但我觉得我最大的问题是代码设计本身。
比方说,我会用任何面向对象的语言(示例中的 java)执行相同的代码,我可以编写一些接口,并且在测试中简单地覆盖我想要模拟的默认行为,设置 a fake ClientRepository,无论重新实现什么固定回报,或使用一些模拟框架,如 mockito。
public interface ClientRepository {
Client getClient(int id)
}
public class ClientRepositoryDB {
private ClientRepository repository;
//getters and setters
public Client getClientById(int id) {
Client client = repository.getClient(id);
//Some data manipulation and validation
}
}
Run Code Online (Sandbox Code Playgroud)
但是我无法在 Rust 中获得相同的结果,因为我们最终将数据与行为混合在一起。
在RefCell 文档中,有一个与我在 java 上给出的示例类似的示例。一些答案指向特征、clojures、条件编译
我们可能会在测试中带来一些场景,第一个是某些 mod.rs 中的公共功能
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct SomeData {
pub name: Option<String>,
pub address: Option<String>,
}
pub …Run Code Online (Sandbox Code Playgroud) 我已经遵循了不少的文件,并试图重用一个例子,但我不能让我的代码工作.
我的Cargo.toml看起来像这样:
[package]
name = "Blahblah"
version = "0.3.0"
authors = ["ergh <derngummit@ahwell.com"]
[dependencies]
[[bin]]
name = "target"
path = "src/main.rs"
[features]
default=["mmap_enabled"]
no_mmap=[]
mmap_enabled=[]
Run Code Online (Sandbox Code Playgroud)
我想根据我传递给cargo build命令的功能配置,使用与mmap不同的缓冲区来本地测试我的代码.我的代码中有这个:
if cfg!(mmap_enabled) {
println!("mmap_enabled bro!");
...
}
if cfg!(no_mmap) {
println!("now it's not");
...
}
Run Code Online (Sandbox Code Playgroud)
编译器没有看到任何一个if语句体中的代码,所以我知道这两个cfg!语句都在评估为false.为什么?
我在Rust 0.10中读过条件编译?我知道这不是一个完全重复,因为我正在寻找一个有效的例子.
我想知道这样的事情是否可行
fn main() {
#[cfg(foo)] {
println!("using foo config");
}
}
Run Code Online (Sandbox Code Playgroud)
上下文是一些仅使用单元测试无法充分测试的代码.我经常要运行一个显示信息的"demo"cfg.我正在寻找手动注释/删除某些代码部分的替代方法.