首页 > 解决方案 > 与 Typescript 的集成测试不会调用回调订阅

问题描述

我正在编写一个集成测试来检查后端的 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 响应进行测试:非常适合单元测试,但不适用于集成测试。

还有一件事:当然调试它工作的代码并调用订阅。

有什么线索吗?谢谢

标签: angulartypescriptintegration-testing

解决方案


最后,我发现问题与我在 testBed 配置的导入中使用 HttpClientModule 和 HttpClientTestingModule 的事实有关,并且不知何故破坏了集成测试。删除 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
        );
    })));
});
})

推荐阅读