在Angular 6中使用HTTP请求测试服务方法

时间:2018-07-12 14:21:12

标签: angular unit-testing jasmine observable karma-jasmine

我的一个单元测试有问题,而包含HTTP发布请求的函数未返回应有的字符串。这是有问题的服务功能:

public getAnonToken(prev?: string): string {
        if (this.tokens[prev]) {
            return this.tokens[prev]
        }

        if(prev) {
            this.tokens[prev] = prev;
        }        

        this.http.post<any>(HttpUrl.ANON_TOKEN, {})
            .subscribe((response) => {
                this.saveAuthToken(response.data);
                this.tokens[prev] = response.data;

                // analytics!!!
                // Global.internalAnalytics.getAnonToken();
                return response.data;
            });            
    }

如您所见,对令牌生成端点的请求返回了一个可观察对象,然后我订阅了该对象,并从getAnonToken()函数返回了令牌。

这是我的测试:`

fit("should call the token endpoint and save then return a new token if old token has expired", () => {
    const mockTokenResponseData = {
        data: "i am a token"         
    }
    spyOn(httpClient, "post").and.returnValue(Observable.of(mockTokenResponseData));

    expect(authService.getAnonToken()).toEqual("i am a token");        

});`

如您所见,我正在创建一个模拟响应(一个可观察的响应),然后在使用间谍进行发布请求时将其设置为返回值。取而代之的是,我没有得到“我是令牌”的定义。我有一种感觉,这是因为测试未等待可观察对象返回,但是我不确定如何解决。有人可以看到这里发生的事情吗? 谢谢

1 个答案:

答案 0 :(得分:2)

您丢失了在函数中返回this.http.post的情况,而且您还需要将expect放入subscription

将呼叫退回到http.post

return this.http.post<any>(HttpUrl.ANON_TOKEN, {})
    .subscribe((response) => {
        this.saveAuthToken(response.data);
        this.tokens[prev] = response.data;

        // analytics!!!
        // Global.internalAnalytics.getAnonToken();
        return response.data;
    });            

请不要在return前面的this.http.post

expect放在subscription

authService.getAnonToken().subscribe((data) => {
    expect(data).toEqual("i am a token");
});

希望有帮助