相关疑难解决方法(0)

Rust 条件编译属性覆盖了多少行?

我正在尝试使用条件编译语句。除了定义一个只应存在于调试版本中的函数之外,我想定义一组仅存在于调试版本中的变量/常量/类型。

#[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)

在这种情况下,条件编译属性实际上“覆盖”了多少行?它只有一个(在这种情况下我会期望什么)?有没有办法确保整个代码块(包括变量、类型和两个函数)都被条件覆盖?

conditional-compilation rust

6
推荐指数
2
解决办法
2811
查看次数

Rust 中的单元测试、模拟和特征

我目前正在构建一个严重依赖文件 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)

tdd unit-testing mocking traits rust

5
推荐指数
2
解决办法
3654
查看次数

如何在Rust中使用条件编译宏的示例

我已经遵循了不少文件,并试图重用一个例子,但我不能让我的代码工作.

我的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中读过条件编译?我知道这不是一个完全重复,因为我正在寻找一个有效的例子.

rust

3
推荐指数
1
解决办法
1184
查看次数

是否有可能在函数内有条件地编译代码块?

我想知道这样的事情是否可行

fn main() {
    #[cfg(foo)] {
        println!("using foo config");
    }

}
Run Code Online (Sandbox Code Playgroud)

上下文是一些仅使用单元测试无法充分测试的代码.我经常要运行一个显示信息的"demo"cfg.我正在寻找手动注释/删除某些代码部分的替代方法.

conditional-compilation rust

1
推荐指数
1
解决办法
1931
查看次数