Я тестирую функцию, которая запускает DNS-запрос, используя trust-dns-resolver
, и я использую 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()]);
}
}
Суть кода
[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
.