Unit testing 如何编写测试模块的函数存根?

Unit testing 如何编写测试模块的函数存根?,unit-testing,rust,integration-testing,stub,Unit Testing,Rust,Integration Testing,Stub,在我过去测试C代码的经验中,函数存根几乎是强制性的。在我的安全关键型工作中,我通常需要测试所有东西——甚至是抽象函数,它们只是以构建特定的实现参数为参数,以返回为返回 我已经到处寻找各种方法,在Rust中,测试模块外部的存根函数,但找不到解决方案 有几个特征模拟库,但我很少读到关于这个主题的内容,这表明它不是我想要的 另一个建议是,我测试的调用外部函数的函数将传递这些函数,从而允许测试只传递所需的伪存根函数。就伪存根进出的数据而言,这似乎是非常不灵活的,并且会导致代码在每一级都被函数引用参数所污

在我过去测试C代码的经验中,函数存根几乎是强制性的。在我的安全关键型工作中,我通常需要测试所有东西——甚至是抽象函数,它们只是以构建特定的实现参数为参数,以返回为返回

我已经到处寻找各种方法,在Rust中,测试模块外部的存根函数,但找不到解决方案

有几个特征模拟库,但我很少读到关于这个主题的内容,这表明它不是我想要的

另一个建议是,我测试的调用外部函数的函数将传递这些函数,从而允许测试只传递所需的伪存根函数。就伪存根进出的数据而言,这似乎是非常不灵活的,并且会导致代码在每一级都被函数引用参数所污染——当被测函数除了一个操作函数或存根之外永远不会调用任何东西时,这是非常不可取的。您正在编写操作代码以适应测试系统的限制


这似乎很基本。当然,有一种方法可以将外部功能与锈迹和货物联系起来?

您可以尝试使用类似的模拟板条箱,我认为这是比较完整的,但可能还需要一些时间来适应。
如果没有模拟板条箱,我建议在另一个板条箱中模拟traits/structs,然后使用
#[cfg(test)]
属性将其纳入范围。当然,这将强制您使用“#[cfg(not(test))”注释
production
use语句。例如:

如果使用
外部板条箱中的外部结构
ExternalStruct
和方法
external\u方法
,则会出现如下情况:

文件
real\u code.rs

#[cfg(非(测试))]
使用外部板条箱::ExternalStruct;
#[cfg(测试)]
使用test_mocks::ExternalStruct;
fn my_函数(){
//...
ExternalTrait::external_方法();
}
#[测试]
fn test_my_function(){
my_函数();
}
文件
test\u mocks.rs

pub-Struct-ExternalStruct{}
impl外部结构{
pub fn外部_方法(){
//想要的模仿行为
}
}

运行测试时,将使用测试模拟中的ExternalStruct,否则将使用真正的依赖项。

这是否回答了您的问题?“肯定有一种方法可以将外部功能与锈迹和货物联系起来?”简短的回答是“并非没有使用一些宏魔法,某些板条箱可能提供的只是YMMV”。如果使用标准实现为测试模块创建类型别名,则“导致代码在每个级别都被函数引用参数污染”不完全正确。您好,感谢您的回复。我不确定我是否遵循了第二条。不过,第一个问题正是我想要避免的——让代码变得更复杂,这样就可以对其进行测试。如果通过traits进行依赖注入不是一个选项,那么您可以让您的
use
语句在测试环境中导入不同的内容。它不是很灵活,但这可能是你想要的吗?