You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular5单元测试:调用Scope服务始终进入失败回调求排查

问题排查与解决方案

咱们一步步拆解你遇到的问题:

核心错误点:Observable.create的用法完全错了

你在getScopesByTenantEndpoint里写的return Observable.create(scopes);是问题根源——Observable.create()要求传入的是一个订阅函数(比如接收observer参数的回调),而不是直接传数据(这里的scopes是localStorage取出的字符串)。当你直接把字符串传给create时,Angular订阅这个Observable的瞬间就会抛出错误,这就是为什么每次都跳转到失败回调的原因。

次要问题:localStorage数据需要解析

另外,localStorage.getItem()返回的是字符串类型,哪怕你存进去的是对象,取出来也得用JSON.parse()转成JS对象,不然返回的字符串大概率不符合你期望的T类型。

修复后的服务方法代码

把getScopesByTenantEndpoint改成下面这样(适配Angular5常用的RxJS 5版本):

getScopesByTenantEndpoint<T>(searchText: string, onlyActive: boolean): Observable<T> {
  const scopesStr = localStorage.getItem('scopeObject');
  if (scopesStr) {
    // 先解析字符串为目标类型对象,再用Observable.of返回合法的数据流
    const scopes: T = JSON.parse(scopesStr);
    return Observable.of(scopes);
  } else {
    // 返回空Observable,只会触发complete回调,不会触发error
    return Observable.empty();
  }
}

额外调整:空数据场景的处理(可选)

如果希望localStorage无数据时也进入失败回调,可以把Observable.empty()改成:

return Observable.throw('No scopes data found in localStorage');

单元测试的补充建议

写单元测试时,记得mocklocalStorage来覆盖两种场景:

// 模拟存在数据的场景
spyOn(localStorage, 'getItem').and.returnValue(JSON.stringify(mockScopesData));

// 模拟无数据的场景
spyOn(localStorage, 'getItem').and.returnValue(null);

内容的提问来源于stack exchange,提问作者Niranjan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:18:33