Интеграционный тест с Typescript не вызывает обратный вызов в подписку - PullRequest
0 голосов
/ 26 апреля 2018

Я пишу интеграционный тест для проверки API на сервере.

Услуга:

export class Service {
    check(details: Credential, successBlock, errorBlock){
        let localString = "changeAuthenticationCredentialAPI/v2/authenticationCredential/check";


        let url = BASE_URL_SERVER + localString;
        let body = { details };
        let success = (data) => { 

            let _authorization = data.headers["Authorization"];
            let _clientID = data.body.relatedParty[0].id[0].value;
            let _token : Token = {};
            _token.token = _authorization;
            _token.clientId = _clientID;


            successBlock(_token);
        }

        this.post(success,errorBlock,url,body);
    }
    
    handleErrorSync(error) {
        try {
            return Observable.throw(JSON.parse(error._body));
        } catch (e) {
            return Observable.throw(error._body);
        }
    }

    
    post(success, error, url, body) {
        const options = {
            headers: new HttpHeaders(HEADER_REQUEST)
        };

        let call = this.http.post(url, body,options).catch(this.handleErrorSync);
        this.makeCall(call, success, error);
    }

    makeCall(call, success, error) {
        call.flatMap(
            (result) => {

                if (this.responseIsOk(result)) {

                    return Observable.of(result);
                } else {

                    error(result);
                    return Observable.throw(result);
                }
            }
        ).subscribe(
            (result) => {

                 success(result); },
            (err) => {

                this.popupError(err);
                error(err);
            }
        );
    }
 }

На что интеграционный тест выглядит как

describe("authentication-credential-service.spec", () => {
    let backend : Service


    beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [
                HttpClientModule,
                HttpClientTestingModule
            ],
            providers: [
                Service,
                { provide: ToastController, useClass: class { ToastController = jasmine.createSpy("ToastController"); } },
                { provide: ModalController, useClass: class { ModalController = jasmine.createSpy("ModalController"); } },
                FileTransfer,
                File
            ]
        });

        backend = TestBed.get(Service);
    }));



    it("should be created", inject([Service], (service: Service) => {
        expect(service).toBeTruthy();
    }));


    describe("check", () => {
       it( "should answer 200 with the right token", async(inject([Service], (service:Service) => {
            let credential: Credential = {}; 
            credential.credentialType = "password";
            credential.usernameText = "user";
            credential.passwordText = "therightpassword";
            let _result : Token 
            let successBlock = ( (data) => { 
                _result = data
                expect(data).toBeDefined();
            } );
            let errorBlock = (error) => {
                expect(false).toBeTruthy();
            };
            service.check(
                credential,
                successBlock,
                errorBlock
            );
        })));
    });

})

Проблема в том, что при запуске теста подписка на метод makeCall никогда не вызывается. Так что, в основном, тест пройден, но только потому, что тест не запускается.

Основная цель использовать это для проверки согласованности с остальными API моего бэкэнда, но там я нашел только тестирование с имитированным бэкэндом или с поддельным http-ответом: идеально подходит для модульного тестирования, но не для интеграционных тестов.

Еще одна вещь: конечно, отладка кода, который он работает, и вызов подписчика.

Есть подсказка? Спасибо

1 Ответ

0 голосов
/ 06 июня 2018

В конце я обнаружил, что проблема была связана с тем, что я использовал HttpClientModule и HttpClientTestingModule в импорте конфигурации testBed, и это каким-то образом повредило интеграционный тест. Удаление HttpClientTestingModule сделало свое дело

describe("authentication-credential-service.spec", () => {
let backend : Service


beforeEach(async(() => {
    TestBed.configureTestingModule({
        imports: [
            HttpClientModule
        ],
        providers: [
            Service,
            { provide: ToastController, useClass: class { ToastController = jasmine.createSpy("ToastController"); } },
            { provide: ModalController, useClass: class { ModalController = jasmine.createSpy("ModalController"); } },
            FileTransfer,
            File
        ]
    });

    backend = TestBed.get(Service);
}));



it("should be created", inject([Service], (service: Service) => {
    expect(service).toBeTruthy();
}));


describe("check", () => {
   it( "should answer 200 with the right token", async(inject([Service], (service:Service) => {
        let credential: Credential = {}; 
        credential.credentialType = "password";
        credential.usernameText = "user";
        credential.passwordText = "therightpassword";
        let _result : Token 
        let successBlock = ( (data) => { 
            _result = data
            expect(data).toBeDefined();
        } );
        let errorBlock = (error) => {
            expect(false).toBeTruthy();
        };
        service.check(
            credential,
            successBlock,
            errorBlock
        );
    })));
});
})
...