使用jasmine.SpyObj创建假TodoService时出现pipe不是函数错误求助
解决TypeError: this.todos$.pipe is not a function问题
你的错误根源在于错误使用jasmine.createSpyObj定义服务属性:
jasmine.createSpyObj的第二个参数如果是对象,仅用于配置方法的返回值,但todolist$是TodoService中的Observable属性,并非方法。当前写法会让todolist$被当成spy方法,而非Observable实例,导致调用.pipe()时触发类型错误。
修正方案
先创建仅包含方法的spy对象,再手动为属性赋值:
fdescribe('TodoListComponent With FakeService', () => { let fixture: ComponentFixture<TodolistComponent>; let component: TodolistComponent; let fakeTodoService: jasmine.SpyObj<TodoService>; beforeEach(async () => { // 1. 创建spy对象,仅声明需要mock的方法 fakeTodoService = jasmine.createSpyObj<TodoService>('TodoService', ['getTodos', 'deleteTodo', 'addTodo']); // 2. 手动设置服务的Observable属性 fakeTodoService.todolist$ = of(mocktodos); fakeTodoService.currentTodoList = []; // 3. 为mock方法配置返回值 fakeTodoService.getTodos.and.returnValue(of(mocktodos)); fakeTodoService.addTodo.and.returnValue(of(mocktodos[0])); // deleteTodo若无需返回值可省略,或按需设置:fakeTodoService.deleteTodo.and.returnValue(of(undefined)) await TestBed.configureTestingModule({ declarations: [TodolistComponent], providers: [ { provide: TodoService, useValue: fakeTodoService, }, ], }).compileComponents(); fixture = TestBed.createComponent(TodolistComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should do something', () => {}); });
关键说明
jasmine.createSpyObj的数组参数用于声明要监听的方法名,对象参数仅用于配置方法返回值,不能用来定义属性。- 服务中的Observable属性需要直接赋值为真实的Observable实例(比如用
of()创建),这样组件调用.pipe()时才能正常工作。
内容的提问来源于stack exchange,提问作者Yue Dong
相关产品推荐
相关产品推荐

