Angular单元测试报inject()需在注入上下文调用,preserveSymlinks配置无效如何解决
报错修复方案
- 补全测试模块缺失的依赖注入
AppComponent构造函数中注入了CookieService,但你的测试模块providers数组中没有配置该服务的提供规则,是触发本次报错的最直接原因。你可以选择直接mock该服务,避免引入额外依赖:
把测试文件的providers修改为:
providers: [ Api, LoginService, { provide: CookieService, useValue: jasmine.createSpyObj('CookieService', ['get', 'put', 'remove']) } ]
- 修复tsconfig的路径匹配规则
你当前tsconfig.app.json中的paths配置缺少通配符,会导致Angular多实例加载,公共包is-common和当前项目会加载两份独立的Angular依赖,从而触发注入上下文错误。另外单元测试读取的是tsconfig.spec.json配置,需要同步修改:
两个配置文件的compilerOptions.paths都改为:
"paths": { "@angular/*": [ "../node_modules/@angular/*" ] }
- 同步修改test配置的preserveSymlinks
你之前只在angular.json的build配置中添加了preserveSymlinks: true,需要在test配置块中也添加相同配置,测试阶段才会生效。 - 可选优化:mock公共包服务
如果is-common是你本地开发的公共依赖包,不想处理多实例问题,可以直接mock所有来自公共包的服务,完全避免依赖冲突:
providers: [ { provide: Api, useValue: jasmine.createSpyObj('Api', []) }, { provide: LoginService, useValue: jasmine.createSpyObj('LoginService', ['isLogged', 'setApiURL', 'setDefaultClient']) }, { provide: CookieService, useValue: jasmine.createSpyObj('CookieService', ['get', 'put', 'remove']) } ]
内容的提问来源于stack exchange,提问作者David Angarita
相关产品推荐
相关产品推荐

