使用基于axios的客户端进行NestJS:e2e测试并没有按预期工作



我有一个NestJS应用程序,它公开了一些端点,我已经编写了一个客户端应用程序,我计划将其作为NPM包发布,以与嵌套服务器一起工作。我正在尝试编写端到端测试,启动嵌套服务器,将其连接到本地docker容器中的测试数据库,并使用客户端进行测试。以下是我尝试做的一些片段:

控制器:

@Controller('/api/v1/messages')
export class MessagesController {
constructor(
private messagesService: MessagesService
) {}
@Get()
@UsePipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true }))
private findAll(
@Query() searchCriteria: MessageSearchDto
): Promise<MessageDto[]> {
if (Object.keys(searchCriteria).length > 0) 
return this.messagesService.search(searchCriteria);
return this.messagesService.findAll();
}
}

客户:

const http = require('axios');
const dotenv = require('dotenv');
dotenv.config();
export class MessageClient {
public baseUri: string = process.env.MessageClientTarget ?? './';
constructor() {}
public async findAll() {
return await http.get(this.baseTarget());
}
private baseTarget() {
return `${this.baseUri}/api/v1/messages`;
}
}

e2e测试:

describe('MessageController (e2e)', () => {
let app: INestApplication;
let client: MessageClient = new MessageClient();
beforeAll(async () => {
let moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule, MessagesModule],
}).compile();
app = moduleFixture.createNestApplication();
await app.init();
});
afterAll(async () => {
await app.close();
});
it('/ (GET)', async done => {
const { data: messages } = await client.findAll()
expect(messages).toEqual([]);    
done();
});
});

和.env:

MessageClientTarget=http://localhost:3000

当我尝试运行这个时,我得到以下错误:;连接ECONNREFUSED 127.0.0.1:3000";

据我所知,这是因为createNestApplication方法实际上并没有启动服务器,而是创建了一个模拟版本的应用程序。

我的问题是,我如何使用INestApplication或TestingModule来启动应用程序,或者我必须用什么其他方式以编程方式启动NestJS应用程序。对我来说,重要的是,我使用基于Axios的客户端执行e2e测试,而不是将超级测试作为测试客户端和服务器的一种方式。

我已经验证了服务器应该在端口3000本地启动,并且已经验证了客户端是否设置了正确的baseUri。客户端在测试期间使用的地址为:http://localhost:3000/api/v1/messages并且在测试期间通过将该值输出到控制台来验证。此外,目前只有数据库位于docker容器中,并且我已经正确运行了该容器。整个应用程序在本地运行时运行良好,只有在测试中才失败。

请确保运行测试的测试环境设置为node。在您的jest配置文件中添加testEnvironemnt:'node'jest参数。

您可以使用您选择的任何客户端运行e2e测试,无论您是运行nestjs测试模块还是实际的nestjss应用程序实例。我个人使用测试模块,因为在测试应用程序时,它可以很容易地模拟应用程序的任何第三方依赖关系(这是测试模块的主要目的,提供了一种优雅的方式来替换或模拟您可能想要的任何组件(。

最新更新