使用jasmin使用带有async / await的$ httpBackend测试角度服务

问题描述 投票:3回答:2

我之前已经成功测试过使用ES7 async / await语法和jasmine的角度控制器 -

async updateGridAsync() {
        const paging = angular.copy(this.gridData.getServerCallObj());            
        }
        try {
            const model = await this.service.getAsync(paging);
            this._$rootScope.$apply();
        } catch (e){this._notification.error(this._$rootScope.lang.notifications.unexpectedError);
        }
    }

it('updateGridAsync() should update the gridData when succeed', async (done) => {
    expect(ctrl.gridData.totalItems).toEqual(2);
    expect(ctrl.gridData.items.length).toEqual(2);
    spyOn(service, 'getAsync').and.callFake(() => {
        return Promise.resolve(responseStub);
    });
    await ctrl.updateGridAsync();
    expect(service.getAsync).toHaveBeenCalled();
    expect(ctrl.gridData.totalItems).toEqual(1);
    expect(ctrl.gridData.items.length).toEqual(1);
    done();
});

上面的代码完美无缺。但是,一旦尝试测试调用$ http.post的模拟服务代码,我遇到了一个问题。这是我在服务中运行的代码:

async getAsync(pagingData, spinner, gridId, payeeId){            
        const response = await $http.post(url, params);
        const model = this.modelFactory(response.data);
        return model ;
    }

以及在updateGridService中等待await之后无法执行的测试方法:

it('getAsync should return correct model', async (done) => {                
    $httpBackend.whenPOST(theUrl).respond(200, responseStub);

    const model = await service.getAsync();

    expect(model.list.length).toEqual(2);        
    $httpBackend.flush();
    done();
});

有几点需要指出 -

  • 在使用async await之前,此测试已通过。现在,我没有通过服务等待。
  • 不在测试环境中时,该功能有效。
  • 我正在使用jasmine 2.4.1和angularJS 1.6
angularjs jasmine ecmascript-2017
2个回答
1
投票

我不认为你可以一起使用它们 - 等待实际上等待后端承诺解决并且由刷新触发,但在任何请求发出之前触发它也没有好处。

我的意思是,如果你想以一种简单的方式使用它,我个人会使用它来帮助刷新操作创建超时,然后等待请求。

export async function withHttp(
    callbackHttp: (http: HttpTestingController) => void,
    callbackTest: () => Promise<void>
): Promise<void> {
    const http = TestBed.get(HttpTestingController);
    setTimeout(() => callbackHttp(http));
    await callbackTest();
}

也不要将async测试方法与done一起使用(并且当它刚刚在最后一行测试时调用时不要使用,当时不需要它)。


0
投票

刚遇到同样的问题,我认为没有解决方案。也许升级到Angular 7会有所帮助,希望问题在那里得到解决。但这不是一个快速的解决方案。

等待执行HTTP调用的异步方法会导致死锁,因为在调用$httpBackend.flush()之前,HTTP调用不会返回。

不等待异步方法也无济于事。然后$httpBackend.flush()之后的断言可能会失败,因为框架在继续断言之前不会等待足够长的时间。

我真的很想知道这个“神奇”是如何实现的。似乎当异步方法返回voidIPromise<void>时,它可以正常工作。返回Promise<void>(或使用async)不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.