Угловой тест с кармой подделка проблем XmlHttpRequest - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь протестировать угловой сервис (на основе feathersJS) с помощью стандартных инструментов углового тестирования (Карма и Жасмин).

Поскольку мой сервис делает XHR-вызов на сервер (используя socket.io)), Я хочу посмеяться над этими вызовами, чтобы протестировать службу.

Я использую библиотеку sinon.js, которая предоставляет функциональные возможности для создания поддельного сервера, и эта часть работает.

Моя проблема в том, что когда я проверяю XHR-ответ в моем тесте, появляются другие XHR-запросы из веб-пакета, которые пытаются загрузить "polyfill.js".Это происходит, когда я вызываю метод authenticate для своего сервиса, поэтому из-за запроса webpack xhr обещание всегда возвращается к коду перехвата.

См. Подробности ниже, так что если кто-то может помочь в решении этой «проблемы» илипредоставьте другие советы о том, как смоделировать XHR-запросы в тестах Angular / jasmine / karma

Обратите внимание, что я думаю, что насмешка над глобальным объектом xmlHttpRequest в браузере может быть сложной ...

Спасибо!

Подробности:

Полная ошибка:

Ошибка: истекло время ожидания соединения сокета при setTimeout (http://localhost:9876/node_modules/@feathersjs/authentication-client/lib/passport.js?:120:1) в ZoneDelegate ../ node_modules / zone.js / dist / zone.js.ZoneDelegate.invokeTask (http://localhost:9876/_karma_webpack_/polyfills.js:2883:31) в ProxyZoneSpec.push ../ node_modules / zone.js / dist / zone-testing.js.ProxyZoneSpec.onInvokeTask (http://localhost:9876/node_modules/zone.js/dist/zone-testing.js?:319:1) в ZoneDelegate ../ node_modules / zone.js / dist / zone.js.ZoneDelegate.invokeTask (http://localhost:9876/_karma_webpack_/polyfills.js:2882:36) в Zone ../ node_modules / zone.js/dist/zone.js.Zone.runTask (http://localhost:9876/_karma_webpack_/polyfills.js:2650:47) в ./node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask (http://localhost:9876/_karma_webpack_/polyfills.js:2958:34) в ZoneTask.invoke (http://localhost:9876/_karma_webpack_/polyfills.js:2947:48) в таймере (http://localhost:9876/_karma_webpack_/polyfills.js:4516:29)"

Обратите внимание, что мой сервис не делает этот XHR ...

Вот моя (очень простая) тестовая спецификация в жасмине:

import { AppLoggerService } from '../../logger/app-logger/service/app-logger.service';
import { fakeAsync, async, tick } from '@angular/core/testing';
import { mock, instance, when, deepEqual, verify } from 'ts-mockito';
import { FeathersjsBackendService } from './backend-feathers.service';
import { BackendConfigClass } from 'src/app/shared/models/backend-config.model';
import * as sinon from 'sinon'

describe('Feathers backend service', () => {
    var MockLoggerService: AppLoggerService = null
    var feathersBackendService: FeathersjsBackendService = null
    const fakeURL: string = 'http://localhost/socket.io'
    var feathersBackendServiceConfig: BackendConfigClass = { apiEndPoint: fakeURL }
    var mockSocketServer: any = null;

    // create fake websocket server
    beforeAll(() => {

    })


    beforeEach( () => {
        mockSocketServer = sinon.createFakeServer()
        mockSocketServer.respondWith(/http:\/\/localhost\/socket\.io\/.*/, function (xhr, id) {
            xhr.respond(200, {}, 'authenticate')
        })

        mockSocketServer.respondWith(/^\/_karma_webpack_.*/, function (xhr, id) {
            xhr.respond(200, {}, 'webpack module')
        })

        MockLoggerService = mock(AppLoggerService)
        feathersBackendService = new FeathersjsBackendService(instance(MockLoggerService), feathersBackendServiceConfig)
        expect(feathersBackendService).not.toBeNull()
    })

    afterEach( () => {
        mockSocketServer.restore();
    })

    it('#1 - Should mock authenticate', () => {
        var isAuth: boolean = false;
        feathersBackendService.authenticate({ strategy: 'anonymous' })
            .then((user) => {
                isAuth = true;
            })
            .catch((error) => {
                let a = 0;
            })
        mockSocketServer.respond();
        expect(isAuth).toBe(true);
    })

})

1 Ответ

0 голосов
/ 10 декабря 2018

После многих испытаний я считаю, что насмешка по socket.io - плохая идея.Поэтому я внедрил в свой проект поддельный сервер, который обеспечивает статический ответ на запрос Ajax / socket.io.

...