angular - 在 Angular 6 中使用 HTTP 请求测试服务方法
问题描述
我的一个单元测试有问题,而包含 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");
});`
如您所见,我正在创建一个模拟响应(一个可观察的),然后在使用 spy 发出发布请求时将其设置为返回值。而不是“我是一个令牌”,我没有定义。我有一种感觉,这是因为测试不是在等待 observable 返回,但我不确定这是如何解决的。谁能看到这里发生了什么?谢谢
解决方案
您缺少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");
});
希望能帮助到你
推荐阅读
- agens-graph - 如何在 AgensGraph 上查找标签的所有属性名称?
- cplex - cplex sos 类型 1 添加
- javascript - 数组包括重复错误,即使数据中存在值
- python-3.x - 从 python 向特定的 Outlook 电子邮件发送电子邮件回复
- sas - SAS: Delete missing items in a macro variable
- java - BoolQuery 在 ElasticSearch 中的“过滤器”的目的是什么?
- maximo - 从 Maximo autoscript 中的默认值控件获取默认值
- mysql - mysql> ERROR 1044 (42000): Access denied for user 'root'@'localhost'
- android - 是否会在 navigationManager.simulate() 之前收到到目的地的距离
- cmake - 尝试构建依赖于它的库时,libtiff 检查失败