我的一个单元测试有问题,而包含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");
});
希望它能帮助