【问题标题】:Testing HttpClient call with callFake()使用 callFake() 测试 HttpClient 调用
【发布时间】:2017-11-29 14:47:24
【问题描述】:

我正在尝试创建一个规范来测试我的 Angular 服务中发出 GET 请求的方法。我遇到的困难是嘲笑该方法以使其返回错误而不是响应。如果我无法让它返回错误(例如 400 或 500),我将无法提供完整的代码覆盖率......

正在测试的代码:

maingrid.service.ts:

 async loadAccountListPromise(id: string) {
     let queryParams = `?emailAddress=${id}`;
     let promise = new Promise((resolve, reject) => {
          this.http.get(`${this.baseUrl}` + queryParams, { responseType: 'json' })
             .toPromise()
             .then(
             (data) => {
                 this.results = this.formatData(data);
                 resolve(this.results);
             },
             (err) => {
                 this.logService.error('loadAccountListPromise() exception:', err);
                 this.setError(this.message[0], err);
                 reject('loadAccountListPromise() exception');
             }
         );
     });
     return promise;
 }

 setError(errorMessage: string, errorCode?: string): void {
     this._error.next(new NxpError(errorMessage, 'AccountListService', 
     errorCode));
 }

 clearError(): void {
     this._error.next(null);
 }

这是我尝试编写的规范,用于使用 callFake() 模拟该方法:

maingrid.service.spec.ts

    it('logs and sets a local error for system errors/exceptions', () => {

            let id: string = 'ppandya@pershing.com';
            let myUrl = 'https://localhost:9999/...';
            let queryParams = `?emailAddress=${id}`;

            spyOn(httpClient, 'get').and.callFake( loadAccountListPromise( (response) => {
                // need to return error here...somehow
            }));

            spyOn(logService, 'error');

            spyOn(maingridService, 'setError');

            maingridService.loadAccountListPromise(id);

            let request = httpMock.expectOne(myUrl + queryParams);

            expect(request.request.method).toEqual('GET');

            httpMock.verify();

            expect(logService.error).toHaveBeenCalled();
            expect(maingridService.setError).toHaveBeenCalled();
        });

我不确定我需要做什么才能正确模拟 loadAcountListPromise() 方法,以便它进入错误块并调用 setError()logService.error() 方法。

【问题讨论】:

    标签: javascript angular unit-testing jasmine httpclient


    【解决方案1】:

    尝试使用 'spyOn()' 并像这样返回一个 throw:

    spyOn(httpClient, 'get').and.returnValue(Observable.throw({status: 404}));
    //Observable.throw(new Error(`Error: ${error}`));
    

    【讨论】:

    • 好的,我明白了总体思路,但在这种情况下,“可观察”到底是什么?我需要在我的 TestBed 中添加它作为提供者吗? Observable 得到 'cannot find name Observable" 的 ts 错误。我假设我 import 它来自 Rxjs...?
    • 导入import { Observable } from 'rxjs/Observable';
    • 好的,我现在就试试
    • 现在它抛出了一个错误,但现在我的httpMock.expectOne(url) 按预期失败了我不知道如何按照代码路径通过这一点来让expect(logService.error).toHaveBeenCalled() 通过
    猜你喜欢
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多