typescript - pruebas e2e de un microservicio en Nest
Estoy intentando escribir pruebas e2e para un microservicio en Nest. Creo que he creado correctamente mi ProxyClient para poder hacer solicitudes al servicio.
Lo que estoy intentando hacer en mis pruebas:
- Crear un cliente proxy
- Envía un mensaje usando ese cliente
- Haz que el mensaje sea recogido por el servicio
- Devuelve el resultado del procesamiento del mensaje realizado por el servicio
Aquí está lo que tengo hasta ahora... parece que está cerca, pero sigo viendo esto cuando ejecuto mis pruebas.
Esperado: verdadero, Recibido: {"_isScalar": falso, "operator": {"concurrent": Infinito, "project": [Función anónima]}, "source": {"_isScalar": falso, "_subscribe": [Función anónima]}}
import { Inject } from '@nestjs/common';
import { Test, TestingModule } from '@nestjs/testing';
import { ClientsModule, Transport, ClientProxy } from '@nestjs/microservices';
import * as request from 'supertest';
import { HeartbeatModule } from './../src/heartbeat.module';
import { HeartbeatService } from './../src/heartbeat.service';
describe('AppController (e2e)', () => {
let app;
let client: ClientProxy;
beforeEach(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [HeartbeatModule, ClientsModule.register([{ name: 'HEARTBEAT_SERVICE', transport: Transport.TCP }])],
}).compile();
app = moduleFixture.createNestApplication();
await app.init();
client = app.get('HEARTBEAT_SERVICE');
await client.connect();
});
afterAll(async () => {
await client.close();
});
it('sends a level 1 heartbeat message to the HeartbeatService', async () => {
const response = client.send({"cmd": "heartbeat"}, {"type": 1});
expect(response).toBe(true);
});
});
Respuesta #1
Ok, así que me faltaban algunas cosas de beforeEach... aquí está el código que funciona...
import { INestApplication } from '@nestjs/common';
import { Test, TestingModule } from '@nestjs/testing';
import { ClientsModule, Transport, ClientProxy } from '@nestjs/microservices';
import * as request from 'supertest';
import { HeartbeatModule } from './../src/heartbeat.module';
import { HeartbeatService } from './../src/heartbeat.service';
import { Observable } from 'rxjs';
describe('HeartbeatController (e2e)', () => {
let app: INestApplication;
let client: ClientProxy;
beforeAll(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [
HeartbeatModule,
ClientsModule.register([
{ name: 'HEARTBEAT_SERVICE', transport: Transport.TCP },
]),
],
}).compile();
app = moduleFixture.createNestApplication();
app.connectMicroservice({
transport: Transport.TCP,
});
await app.startAllMicroservicesAsync();
await app.init();
client = app.get('HEARTBEAT_SERVICE');
await client.connect();
});
afterAll(async () => {
await app.close();
client.close();
});
it('sends a level 1 heartbeat message to the HeartbeatService', done => {
const response: Observable<any> = client.send(
{ cmd: 'heartbeat' },
{ type: 1 },
);
response.subscribe(json => {
expect(Date.parse(json.now)).toBeLessThanOrEqual(new Date().getTime());
expect(json.originalRequest.type).toBe(1);
done();
});
});
it('sends a level 2 heartbeat message to the HeartbeatService', done => {
const requestJson = {
type: 2,
startTime: 12345,
endTime: 67890,
messagesSent: 22,
};
const response: Observable<any> = client.send(
{ cmd: 'heartbeat' },
requestJson,
);
response.subscribe(json => {
expect(Date.parse(json.now)).toBeLessThanOrEqual(new Date().getTime());
expect(json.messagesReceived).toBe(22);
expect(json.originalRequest.type).toBe(2);
expect(json.originalRequest.startTime).toBe(12345);
expect(json.originalRequest.endTime).toBe(67890);
expect(json.originalRequest.messagesSent).toBe(22);
done();
});
});
});
Estoy recibiendo un error de jest "Jest no salió un segundo después de que se completó la ejecución de la prueba.". Probablemente lo ignoraré, pero estoy abierto a cualquier idea sobre cómo solucionarlo :)
EDITAR: Gracias Jay McDoniel, actualicé mi respuesta con el código completo y funcional.
