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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:13:18