Unit Testing socket.io en Angular
unit-testing typescript (1)
Estoy intentando probar un servicio angular en mi aplicación, lo que crea el cliente socket.io. Mi servicio se ve así:
export class SocketService {
private name: string;
private host: string = window.location.protocol + "//" + window.location.hostname + ":3000";
socket: io.Socket;
constructor() { }
subscribeEvent(name: string): Observable<IJobResp> {
this.setup(name);
return new Observable(observer => {
this.socket.on(''job'', val => observer.next(val))
})
}
private setup(name: string) {
this.name = name;
let socketUrl = this.host + "/" + this.name;
this.socket = io.connect(socketUrl);
}
}
Entonces, para escribir mi prueba, estoy usando la biblioteca de simulacro para configurar un servidor ficticio socket.io. Así es como se ve la prueba:
describe(''SocketService'', () => {
let socket;
const mockServer = new Server(''http://localhost:3000/'');
mockServer.on(''connection'', server => {
mockServer.emit(''job'', ''test message 1'');
});
(window as any).io = SocketIO;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [JobService]
});
});
it(''should xyz, inject([JobService], fakeAsync((service: JobService) => {
service.subscribeEvent(''/'').subscribe(val => {
expect(val).toEqual(''test message 1'');
})
})));
});
Sin embargo, esa prueba arroja el error:
Error: No se pueden hacer XHR desde una prueba asíncrona falsa.
Si no tengo fakeAsync
, la prueba pasa antes de que se procese la aserción en el subscribe()
.
¿Cómo puedo evitar esto?
Actualizar:
Otro enfoque que he intentado es utilizar async
por ejemplo
it(''should subscribe to dwnTime events'', async(inject([JobService], (service: JobService) => {
service.subscribeEvent(''line/602'').subscribe(val => {
expect(val).toEqual(''test 2'');
})
})));
Entonces obtengo:
Error: Tiempo de espera: no se invocó la devolución de llamada asincrónica dentro del tiempo de espera especificado por jasmine.DEFAULT_TIMEOUT_INTERVAL.
Esto parece un problema de tiempo, pero todavía no estoy seguro de por qué?
Su segundo enfoque es el correcto ya que el servidor simulado es real, por lo tanto, necesita aumentar el tiempo de espera configurando
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
(el valor debe ser ajustado)
en cualquier lugar dentro de la función de descripción.
Aquí puedes encontrar un ejemplo completo.