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



我的一个单元测试有问题,而包含HTTP post请求的函数没有在应该返回的时候返回字符串

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");        
});`

正如您所看到的,我正在创建一个模拟响应(一个可观察的响应(,然后在使用spy发出post请求时将其设置为返回值。而不是"我是一个令牌",我得到了未定义。我有一种感觉,这是因为测试并没有等待可观察到的结果返回,但我不确定如何解决。有人看到这里发生了什么吗?感谢

您的函数中缺少返回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;
});            

请不要使用this.http.post前面的return

expect放入subscription

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

希望它能帮助

最新更新