我正在使用actix-web编写一个小型服务。我正在添加集成测试以评估其功能,并注意到在每个测试中,我都必须重复主应用程序中的相同定义,只是它被测试服务包装:
let app = test::init_service(App::new().service(health_check)).await;
如果您只有简单的服务,那么这可以很容易地扩展,但是当中间件和更多配置开始添加时,测试开始变得笨重,另外可能很容易错过某些内容,并且不能评估与主应用程序相同的规格。
我一直在尝试将应用程序从主线程中提取出来,以便能够在我的测试中重复使用它,但没有成功。具体而言,我想创建一个“工厂”来创建应用程序:
pub fn get_app() -> App<????> {
App::new()
.wrap(Logger::default())
.wrap(IdentityService::new(policy))
.service(health_check)
.service(login)
}
这样我就可以在我的测试代码中编写这段内容。
let app = get_app();
let service = test::init_service(app).await;
但编译器需要具体的返回类型,这个类型仿佛是由几个特性和结构体组成的腊肠,其中一些是私有的。
有人有相关经验吗?
谢谢!