借阅检查器认为,对使用嘲笑者创建的嘲笑的引用会使变量持久化

时间:2019-07-01 18:38:31

标签: rust mocking borrow-checker

我正在测试使用trust-dns-resolver运行DNS查询的函数,并且正在使用mockers对其进行模拟。这是代码:

#[cfg(test)]
use trust_dns_proto::rr::rdata::TXT;
#[cfg(test)]
use trust_dns_resolver::error::ResolveResult;
#[cfg(not(test))]
use trust_dns_resolver::Resolver;

#[cfg(test)]
use mockers_derive::mocked;

#[cfg(test)]
#[mocked]
trait ResolverTrait {
    fn txt_lookup(&self, query: &str) -> ResolveResult<TxtLookup>;
}

#[cfg(test)]
#[mocked]
trait TxtLookupTrait {
    fn iter(&self) -> std::slice::Iter<TXT>;
}

#[cfg(test)]
type Resolver = ResolverTraitMock;
#[cfg(test)]
type TxtLookup = TxtLookupTraitMock;

pub fn fn_that_uses_resolver(resolver: Resolver) -> Vec<String> {
    let txtres = resolver.txt_lookup("_example.example.com.").unwrap();
    let mut records: Vec<String> = Vec::new();
    for txt in txtres.iter() {
        let final_record_iter = txt.iter().flat_map(|s| s.iter());
        records.push(String::from_utf8(final_record_iter.cloned().collect()).unwrap());
    }
    records
}

#[cfg(test)]
mod tests {
    use super::*;
    use mockers;

    #[test]
    fn domain_lookup() {
        let txtsinner = vec!["randomness".to_string()];
        let txtstruct = TXT::new(txtsinner);
        let txts = vec![txtstruct];
        let s = mockers::Scenario::new();
        let (res, res_handle) = s.create_mock::<Resolver>();
        let (tl, tl_handle) = s.create_mock::<TxtLookup>();
        s.expect(res_handle.txt_lookup("_example.example.com.").and_return(Ok(tl)));
        s.expect(tl_handle.iter().and_return(txts.iter()));
        assert_eq!(fn_that_uses_resolver(res), vec!["randomness".to_string()]);
    }
}

Gist of the code

[dependencies]
trust-dns-resolver = "0.11.1"
trust-dns-proto = "0.7.4"
mockers = "0.20.0"
mockers_derive = "0.20.0"

这会导致以下错误:

error[E0597]: `tl_handle` does not live long enough
  --> src/main.rs:52:18
   |
52 |         s.expect(tl_handle.iter().and_return(txts.iter()));
   |                  ^^^^^^^^^-------
   |                  |
   |                  borrowed value does not live long enough
   |                  argument requires that `tl_handle` is borrowed for `'static`
53 |         assert_eq!(fn_that_uses_resolver(res), vec!["randomness".to_string()]);
54 |     }
   |     - `tl_handle` dropped here while still borrowed

这个问题与类似的问题不同,因为另一个具有将自身作为不可变借用函数的模拟程序不会引发此错误res_handle

0 个答案:

没有答案