Заемщик считает, что ссылка на макет, созданный с помощью макеров, превосходит переменную - PullRequest
0 голосов
/ 01 июля 2019

Я тестирую функцию, которая запускает 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.

...