Próbuję przetestować usługę kątową w mojej aplikacji, która tworzy klienta socket.io. Moja służba wygląda mniej więcej tak:Testowanie jednostki socket.io w Angular
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);
}
}
Tak aby napisać test, używam biblioteki mock-gniazdo założyć mock serwera socket.io. Oto co test wygląda następująco:
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');
})
})));
});
jednak, że badanie rzuca błąd:
Error: Cannot make XHRs from within a fake async test.
Gdybym nie mamy fakeAsync
, test przechodzi przed stwierdzeniem jest w subscribe()
obrobiony.
Jak sobie z tym poradzić?
Aktualizacja:
Innym podejściem Próbowałem jest użycie np async
it('should subscribe to dwnTime events', async(inject([JobService], (service: JobService) => {
service.subscribeEvent('line/602').subscribe(val => {
expect(val).toEqual('test 2');
})
})));
Następnie uzyskać:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
To wygląda na problem rozrządu, ale nadal nie wiem, dlaczego?
Łatwiej byłoby przetestować usługę, jeśli nie odnosi się ona do globali. Dlaczego nie wstrzyknąć 'io' lub przynajmniej nie zaimportować go, aby coś mogło go zastąpić? –