我正在try 对使用中间件向其传递数据的请求处理程序进行单元测试.在实现中间件测试之前,我可以使用web::Data::new(data)将测试数据传递给处理程序.然而,既然数据被包装在web::ReqData中,我就不知道如何传递数据以进行测试.

示例:

pub async fn handler(
  some_data: web::Data<SomeDataType>,
  req_data: web::ReqData<ReqestDataType>
) -> HttpResponse {
  // some code
}

#[actix_rt::test]
async fn test_fn() {
  let resp = handler(
    web::Data::new(someData),
    // what can I put here?
  ).await;
  assert_eq!(resp.status(), status_code::OKAY);
}

推荐答案

请求-本地数据是附加到单个请求的任意数据,通常通过中间件.它可以通过HttpRequest或ServiceRequest上的扩展_mut来设置

ReqData<T>可以使用ReqData<T>extract方法从HttpRequest中提取. Refer

文档说明了如何创建测试HttpRequesthere

有了这些信息,我们创建了一个测试HttpRequest,然后使用extensions_mut方法设置ReqData,然后使用ReqData::extract方法提取它.

Example:

use actix_web::{HttpResponse, web};

#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct User {
    id: u32,
    name: String,
}

pub async fn handler(
  some_data: web::Data<String>,
  req_data: web::ReqData<User>
) -> HttpResponse {
  // some code
  println!("{:?}", some_data);
  println!("{:?}", req_data);
  HttpResponse::Ok().finish()
}

#[cfg(test)]
mod tests {

    use actix_web::{test, FromRequest, HttpMessage, web::ReqData};

    use super::*;
    #[actix_rt::test]
    async fn test_fn() {
    let http_request = test::TestRequest::default().to_http_request();
    http_request.extensions_mut().insert(User{id: 1, name: "User1".to_string()});
    let _ = handler(
        web::Data::new("Dummy data".to_string()),
        ReqData::extract(&http_request).await.unwrap()
    ).await;
    }
}

Rust相关问答推荐

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

什么是谓词的简短和简洁类型

收集RangeInclusive T到Vec T<><>

使用Rust s serde_json对混合数据类型进行优化'

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

可以为rust构建脚本编写单元测试吗?

如何在嵌套的泛型 struct 中调用泛型方法?

`actix-web` 使用提供的 `tokio` 运行时有何用途?

我可以在 Rust 中 serde struct camel_case 和 deserde PascalCase

一旦令牌作为文字使用,声明宏不匹配硬编码值?

如何递归传递闭包作为参数?

为什么 Rust 允许写入不可变的 RwLock?

我如何将 google_gmail1::Gmail> 传递给线程生成?

Rustlings 切片原语

在空表达式语句中移动的值

在 Rust 中获得准确时间的正确方法?

通用类型,不同于输入类型,作为函数的返回值

有没有办法使用 NASM 语法进行内联汇编?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?