测试模块Mock服务无响应报TypeError,是否遗漏配置?
解决Mock服务订阅报错的问题
首先看你遇到的TypeError: undefined is not a constructor (evaluating 'service.getUser.subscribe')错误,核心原因是你的MockUserService类定义语法错误,导致getUser方法没有被正确初始化,变成了undefined,自然没法调用subscribe。
1. 修正MockUserService的定义
你现在的类写法混用了对象字面量的语法,不是TypeScript类的正确写法。类里的属性/方法应该用类的语法定义,去掉逗号分隔的键值对形式:
// 正确的MockUserService写法 import { of, BehaviorSubject } from 'rxjs'; // RxJS 6+ 要导入对应操作符 class MockUserService { // 用类属性赋值的方式定义spy getUser = jasmine.createSpy('getUser').and.returnValue(of({'name': 'user1'})); getUser2 = jasmine.createSpy('getUser2').and.returnValue(new BehaviorSubject({'name': 'user2'})); }
注:如果你的项目用RxJS 5及以下,可以保留
Observable.of,但需要确保导入import { Observable } from 'rxjs/Observable';
2. 确保测试模块正确替换服务
在测试模块的providers数组里,必须把真实的UserService替换成你定义的Mock服务,否则组件会注入真实服务而非Mock:
beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [TestComponent], providers: [ // 关键:用Mock类替换真实服务 { provide: UserService, useClass: MockUserService } ] }).compileComponents(); }));
3. 检查组件的服务注入逻辑
确保组件是通过构造函数正确注入UserService的,没有使用错误的注入方式:
// 组件中的注入示例 constructor(private userService: UserService) {} // 组件中调用服务的代码要确保是调用getUser属性(你的Mock定义的是属性式spy) this.userService.getUser.subscribe(user => { // 你的业务逻辑 });
额外注意事项
- 对于
BehaviorSubject类型的getUser2,在测试结束后建议调用getUser2.complete(),避免内存泄漏。 - 如果你的Mock服务需要动态返回不同值,可以在测试用例中单独修改spy的返回值,比如:
mockUserService.getUser.and.returnValue(of({'name': 'testUser'}))。
内容的提问来源于stack exchange,提问作者Mandark
相关产品推荐
相关产品推荐

