2017-06-20 37 views
14

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?

+0

Ł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ć? –

Odpowiedz

1

Twoje drugie podejście jest odpowiednia jako serwer makiety jest prawdziwy, więc trzeba zwiększyć limit czasu poprzez ustawienie

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; (wartość ma być regulowana)

gdziekolwiek wewnątrz opisać funkcjonować.

Here można znaleźć pełny przykład.