Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何在actix_web单元测试中获得响应主体?_Rust_Rust Actix_Actix Web - Fatal编程技术网

Rust 如何在actix_web单元测试中获得响应主体?

Rust 如何在actix_web单元测试中获得响应主体?,rust,rust-actix,actix-web,Rust,Rust Actix,Actix Web,我正在用Rust和actix_web构建一个web API服务 我想测试一个路由,并检查接收到的响应主体是否符合我的预期。但我正在努力将收到的bodyResponseBody转换为JSON或BSON。被调用的路由实际上返回application/json let mut app = test::init_service(App::new() .data(AppState { database: db.clone() }) .route("/recipes

我正在用Rust和actix_web构建一个web API服务

我想测试一个路由,并检查接收到的响应主体是否符合我的预期。但我正在努力将收到的body
ResponseBody
转换为JSON或BSON。被调用的路由实际上返回
application/json

let mut app = test::init_service(App::new()
        .data(AppState { database: db.clone() })
        .route("/recipes/{id}", web::post().to(add_one_recipe))
    ).await;

let payload = create_one_recipe().as_document().unwrap().clone();

let req = test::TestRequest::post()
    .set_json(&payload).uri("/recipes/new").to_request();

let mut resp = test::call_service(&mut app, req).await;
let body: ResponseBody<Body> = resp.take_body(); // Here I want the body as Binary, String, JSON, or BSON. The response is actually application/json.
let mut-app=test::init_服务(app::new()
.data(AppState{database:db.clone()})
.route(“/recipes/{id}”,web::post().to(add_one_recipe))
).等待;
让payload=create_one_recipe().as_document().unwrap().clone();
let req=test::TestRequest::post()
.set_json(&payload).uri(“/recipes/new”)。为_请求();
让mut resp=test::call_service(&mut-app,req);
让body:ResponseBody=resp.take_body();//在这里,我希望主体是二进制、字符串、JSON或BSON。响应实际上是application/json。
看看ResponseBody,这看起来像是一种方法:

使用actix_web:{web,App,HttpResponse,HttpServer,Responder};
使用serde::{反序列化,序列化};
#[派生(序列化、反序列化)]
结构问候{
名称:String,
}
异步fn greet()->impl响应程序{
let body=serde_json::to_string(&Greet){
名称:“Test”。to_owned(),
})
.unwrap();
HttpResponse::Ok()
.content_类型(“应用程序/json”)
.机构(机构)
}
#[actix_rt::main]
异步fn main()->std::io::Result{
HttpServer::new(| | App::new().route(“/”,web::get().to(greet)))
.bind(“127.0.0.1:8000”)?
.run()
.等待
}
#[cfg(测试)]
模试验{
使用超级::*;
使用actix_web:{body::body,test,web,App};
使用serde_json::json;
#[活动:测试]
异步fn测试\u问候\u获取(){
让mut-app=test::init_服务(app::new().route(“/”,web::get().to(greet))。等待;
let req=test::TestRequest::with_头(“内容类型”、“应用程序/json”)。to_request();
让mut resp=test::call_service(&mut-app,req);
let body=resp.take_body();
让body=body.as_ref().展开();
断言!(resp.status()为_success());
断言(
&Body::from(json!({“name”:“Test”})),//或serde。。。。。
身体
);
}
}
运行1个测试
测试测试::测试问候获得。。。好啊
测试结果:可以。1人通过;0失败;忽略0;0测量值;0被过滤掉

actix/examples存储库通过定义一个新特性并在
ResponseBody
类型上实现它来实现这一点,尽可能以
&str
的形式返回其内容:

trait BodyTest {
    fn as_str(&self) -> &str;
}

impl BodyTest for ResponseBody<Body> {
    fn as_str(&self) -> &str {
        match self {
            ResponseBody::Body(ref b) => match b {
                Body::Bytes(ref by) => std::str::from_utf8(&by).unwrap(),
                _ => panic!(),
            },
            ResponseBody::Other(ref b) => match b {
                Body::Bytes(ref by) => std::str::from_utf8(&by).unwrap(),
                _ => panic!(),
            },
        }
    }
}

参考完整代码这些摘录摘自:

我必须使用
resp.response().body().as_str()
assert_eq!(resp.body().as_str(), "Your name is John");