Reqwest的Client :: new在第二个帖子中与Iron挂起测试

时间:2018-04-22 18:15:35

标签: testing rust iron reqwest

我在网络抓取工具中使用了Reqwest,我试图为主循环添加测试以确保输出正确。我尝试使用Iron作为假HTTP服务器,并使用预设响应。但是,在我的$events = []; foreach($eventDates as $date){ $events[] = eventDates->event()->first(); } 函数中,main_loop正悬空。

let client = Client::new();的前几行:

_main_loop

我的测试fn _main_loop(starton: String, panic: bool) { //panic("test") // calls as normal let client = Client::new(); // <-- problem! panic("test") // doesn't call let mut future_urls: Vec<String>; // ... }

mod

终端输出:

#[cfg(test)]
mod tests {
    use iron::{Iron, IronResult, Headers};
    use iron::response::Response;
    use iron::request::Request;
    use iron::status;
    use iron::middleware::Chain;
    use iron::headers::ContentType;
    use iron::mime::{Mime, TopLevel, SubLevel};
    use iron::typemap::TypeMap;
    use std;

    use *;

    #[test]
    fn __main_loop() {
        fn handler(req: &mut Request) -> IronResult<Response> {
            let mut mime = Headers::new();
            mime.set(ContentType(Mime(TopLevel::Text, SubLevel::Html, Vec::new())));

            Ok(Response {
                headers: mime,
                status: Some(status::Ok),
                body: Some(Box::new(match req.url.path().join("/").as_str() {
                "" => "<a href='file'></a><a href='file1'></a>",
                "file" => "<a href='/file1'></a>",
                "file1" => "<a href='/file'></a>",
                _ => "not found"
                })),
                extensions: TypeMap::new()
            })
        }

        let child = std::thread::spawn(|| Iron::new(Chain::new(handler)).http("localhost:9999").unwrap());

        let f: Vec<String> = Vec::new();
        assert_eq!(_main_loop("http://localhost:9999/".to_string(), false), f);
    }
}

运行测试单线程($ cargo test Compiling crawler v1.0.0 (file:///home/*******/crawler) warning: unreachable statement --> src/main.rs:82:5 | 82 | let mut future_urls: Vec<String>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: #[warn(unreachable_code)] on by default warning: unused variable: `client` --> src/main.rs:80:9 | 80 | let client = Client::new(); | ^^^^^^ help: consider using `_client` instead | = note: #[warn(unused_variables)] on by default warning: unused variable: `starton` --> src/main.rs:79:15 | 79 | fn _main_loop(starton: String, _panic: bool) -> Vec<String> { | ^^^^^^^ help: consider using `_starton` instead warning: unused variable: `child` --> src/main.rs:239:13 | 239 | let child = std::thread::spawn(|| Iron::new(Chain::new(handler)).http("localhost:9999").unwrap()); | ^^^^^ help: consider using `_child` instead Finished dev [unoptimized + debuginfo] target(s) in 4.24 secs Running target/debug/deps/crawler-9c5de394eb85849d running 9 tests test html::tests::_get_attribute_for_elem ... ok test html::tests::_html_token_sink ... ok test url_utils::tests::_add_url_to_vec ... ok test url_utils::tests::_get_root_domain ... ok test html::tests::_find_urls_in_html ... ok test url_utils::tests::_check_if_is_in_url_list ... ok test url_utils::tests::_remove_get_params ... ok test url_utils::tests::_repair_suggested_url ... ok )时,它以-- --test-threads 1结束。

1 个答案:

答案 0 :(得分:0)

我认为问题是你产生的线程没有终止,测试结束等待它终止(我不知道为什么会发生这种情况,并且它不会在一段时间后被测试运行器杀死),即不是reqwest是问题,而是你的铁服务器。

现在我不确定如何解决这个问题,事实上Listening::close似乎已被打破,因为铁0.6.0仍然依赖于超级0.10而不再具有该功能。

在最糟糕的情况下,您可以直接使用hyper实现服务器,就像我here一样。也许我的原始代码有一个实际的快速解决方案,我不知道。

通常,如果您可以在测试中找到运行服务器的方法,那么在我看来这将是理想的情况。使用我之前链接的包(reqwest-mock,免责声明我是作者)你可以编写_main_loop函数以GenericClient作为参数,然后在测试中模拟请求使用StubClient,并在生产代码中使用直接客户端。但也许您甚至不需要它,并且应该以某种方式设计您的爬虫,以便您可以尽可能彼此独立地测试不同的功能。