Angular11组件RxJS pipe链式调用场景的Jasmine单元测试编写问题
Angular 11 Jasmine链式RxJS请求单元测试解决方案
错误根因
报错来自三个可修复的问题:
- 仅mock了
getDataOne的返回值,switchMap内部调用的getDataTwo未设置mock返回值,jasmine生成的SpyObj默认方法返回undefined,而switchMap要求返回Observable类的流,因此触发类型校验错误。 - 模拟数据
mockSuccessData2的结构和组件内取值逻辑不匹配:组件内订阅时访问res.DATA.RESULT,但当前mock的DATA是字符串,后续会触发RESULT属性未定义的错误。 - 现有mock对象存在语法错误:对象属性末尾错误使用分号,需改为逗号或直接删除。
正确修改步骤
- 修正mock数据的语法和结构,匹配组件内的取值逻辑
- 给
getDataOne、getDataTwo两个Spy方法都设置返回值,均返回RxJS的of()包裹的可观察对象 - 补充对应测试用例验证链式调用逻辑、数据赋值逻辑是否符合预期
完整可运行测试代码
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { of } from 'rxjs'; // 替换为你实际的组件、服务导入路径 import { MyComponent } from './my.component'; import { MyService } from './my.service'; describe('MyComponent', () => { let component: MyComponent; let fixture: ComponentFixture<MyComponent>; const serviceSpy = jasmine.createSpyObj('MyService', ['getDataOne', 'getDataTwo']); // 修正结构后的mock数据 const mockSuccessData1 = { SUCCESS: true, DATA: 'mock result 1' }; const mockSuccessData2 = { SUCCESS: true, DATA: { RESULT: [] // 按你实际业务数据结构填充模拟值 } }; // 可选:请求失败场景的模拟数据 const mockFailData = { SUCCESS: false, ERROR: '数据拉取失败' }; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [MyComponent], // 若组件用到*ngIf/*ngFor等公共指令,需导入CommonModule imports: [], providers: [ { provide: MyService, useValue: serviceSpy } ] }).compileComponents(); fixture = TestBed.createComponent(MyComponent); component = fixture.componentInstance; // 给两个服务方法都设置mock返回值 serviceSpy.getDataOne.and.returnValue(of(mockSuccessData1)); serviceSpy.getDataTwo.and.returnValue(of(mockSuccessData2)); // 触发ngOnInit执行 fixture.detectChanges(); })); it('should create', () => { expect(component).toBeTruthy(); }); // 验证链式调用逻辑 it('should call two service methods in sequence on init', () => { expect(serviceSpy.getDataOne).toHaveBeenCalledOnceWith(12345); expect(serviceSpy.getDataTwo).toHaveBeenCalledOnceWith(12345); }); // 验证成功场景赋值逻辑 it('should assign dataSource when request success', () => { expect(component.dataSource.data).toEqual(mockSuccessData2.DATA.RESULT); expect(component.error).toBeUndefined(); }); // 可选:验证失败场景赋值逻辑 it('should assign error when request fail', () => { serviceSpy.getDataTwo.and.returnValue(of(mockFailData)); component.ngOnInit(); expect(component.error).toBe(mockFailData.ERROR); }); });
内容的提问来源于stack exchange,提问作者Telly Ipock
相关产品推荐
相关产品推荐

