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
相关产品推荐
相关产品推荐

