最近改代码,要把一段代码放进另一个同事写的代码里面。我的代码是一些函数外加一个宏,在main.rs调用foo::doo!(a1, b2);
我自己这一部分代码被main.rs调用的时候没有单元测试(团队认为无法写)。为了至少有一些单元测试,在foo.rs里面我这样写的。
// 把取得服务这一步分两步写,至少有一个函数可以测试了
pub fn get_service() -> Result<..., Error> {
let factory = ....;
get_service_from_factory(factory)
}
// 这个函数可以测试,只要提供一个假的factory
pub fn get_service_from_factory(factory:..){
具体内容不写了
}
那么,foo.rs里面单元测试我们可以做一个假的service,比如
mod tests {
async fn test_get_service_from_factory() {
let mock = ....
let service = get_service_from_factory(mock);
log_something(service, ...);
// 检查mock里面做了什么
}
}
真的提供给main.rs来调用的是
pub async fn log_something(service:..., arg:...) 具体不写了,就是需要调用者传入service,和需要的参数。一般来说首先要取得service,如果成功就接着调用log_something。为了避免麻烦,写了一个宏
macro_rules! doo {
(...)
if let Ok(service) = get_service() {
if let Err(err) = log_something(service, arg).await {
eprintln!(...);
}
}
};
==========================================================
同事的代码是做一个事情,他也遇到了测试的问题,为了能测试,他这样写
// 为了能够测试,把actor传进来
do_work(actor:..., arg:..) {
actor.send(arg)
}
好,他怎么测试呢,就是写了一个假的actor,然后传进去。我们俩做的办法很类似。
==========================================================
到这里希望大家都明白了?我们的代码的一个特点就是为了真的系统所写的代码无法单元测试,为了测试,把struct传进去作为参数。
下面,我要把我的代码集成进去了
do_work(actor:..., arg:..) {
actor.send(arg);
foo::doo...
}
结果系统CQ测试出了问题,自然是我的代码打印了错误信息。当然,本来不算fail,但是系统检查日志的出错信息。所以无法通过CQ。
如果我的代码也还是像他那样直接传入一个可真可假的service, 我可以这样做
do_work(actor:..., service: arg:..) {
actor.send(arg);
foo::log(service,...)
}
但是我用了宏.而宏的使用就是为了避免每一次调用都要一个if嵌套另一个if。有了这个宏,我好像无法把service传进去了?因为本来就是为了避免多重if而在宏里面取得service了。
请问,我有哪些选择?
--
修改:bihai FROM 72.199.121.*
FROM 72.199.121.*