我的一个单元测试有问题,而包含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");
});`
如您所见,我正在创建一个模拟响应(一个可观察的响应),然后在使用间谍进行发布请求时将其设置为返回值。取而代之的是,我没有得到“我是令牌”的定义。我有一种感觉,这是因为测试未等待可观察对象返回,但是我不确定如何解决。有人可以看到这里发生的事情吗? 谢谢
答案 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");
});
希望有帮助