Jasmine SpyObj方法undefined问题:Angular单元测试服务Mock配置错误排查
问题原因及修正方案
核心配置错误:Provider的useValue多嵌套了一层对象
你在providers配置中写的useValue: {applicationsServiceSpy}是ES6对象简写语法,等价于useValue: { applicationsServiceSpy: applicationServiceSpy }。这就导致注入到组件的ApplicationsService实例是这个外层包装对象,getApplications方法实际存在于外层对象的applicationsServiceSpy属性下,自然无法直接通过this.applicationsService.getApplications调用,这也是你打印整个mock对象能看到方法、但直接访问方法返回undefined的直接原因。
修正方式:直接将useValue赋值为applicationServiceSpy本身,不要外层的大括号。多处语法笔误
jasmine.createSpyObj的第一个参数字符串缺少闭合单引号,原代码写为'ApplicationService,正确应为'ApplicationService'TestBed.configureTestingModule的组件配置属性应为复数declarations,你写成了单数declaration,会导致组件声明失效- 多个代码块缺少闭合的括号/花括号:第一个
waitForAsync的回调、第一个beforeEach、整个describe块都缺少对应的闭合符号
修正后的完整测试代码
describe('DashboardComponent', () => { let mockApplicationsService: jasmine.SpyObj<ApplicationsService>; // 修正:补全字符串闭合引号 const applicationServiceSpy = jasmine.createSpyObj('ApplicationService', ['getApplications']); beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ // 修正:改为复数declarations declarations: [DashboardComponent], providers: [ { provide: ApplicationsService, // 修正:去掉外层对象包装,直接传入spy实例 useValue: applicationServiceSpy } ] }).compileComponents(); // 修正:补全waitForAsync和beforeEach的闭合括号 }) ); beforeEach(() => { mockApplicationsService = TestBed.inject(ApplicationsService) as jasmine.SpyObj<ApplicationsService>; fixture = TestBed.createComponent(DashboardComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create the app', () => { console.log(mockApplicationsService); console.log(mockApplicationsService.getApplications); expect(component).toBeTruthy(); }); });
内容的提问来源于stack exchange,提问作者Stephen Agwu
相关产品推荐
相关产品推荐

