Angular 5集成ng-select v1.5.2时Jasmine单元测试报错求助
解决Angular 5中ng-select v1.5.2单元测试模板解析错误问题
这问题本质是测试环境和运行环境的模块配置不一致导致的——运行时你在AppModule里已经正确导入了NgSelectModule,所有依赖都加载到位,但单元测试的独立测试模块没配置齐全,导致Jasmine识别不了ng-select内部组件的属性。给你两个实用的解决办法:
方法1:在测试模块中完整导入NgSelectModule(推荐)
别只单独声明NgSelectComponent,因为它属于NgSelectModule,内部的ng-dropdown-panel组件用到的virtualScroll、bufferAmount等属性依赖模块提供的指令支持。修改你的configuration.component.spec.ts里的TestBed配置:
import { NgSelectModule } from '@ng-select/ng-select'; import { ConfigurationComponent } from './configuration.component'; describe('ConfigurationComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ConfigurationComponent], // 只声明你的业务组件 imports: [ NgSelectModule, // 导入完整的ng-select模块 // 若ng-select用到了表单,记得同时导入FormsModule/ReactiveFormsModule ] }) .compileComponents(); })); // 你的测试用例... });
这种方式完全模拟了真实运行环境的依赖,能避免掩盖潜在的模板问题,是最规范的做法。
方法2:用NO_ERRORS_SCHEMA忽略未知属性(应急方案,不推荐长期用)
如果你只是想快速跳过这个错误(不建议一直用,会隐藏真正的模板拼写或依赖问题),可以在测试模块中添加NO_ERRORS_SCHEMA:
import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ConfigurationComponent } from './configuration.component'; import { NgSelectComponent } from '@ng-select/ng-select'; describe('ConfigurationComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ConfigurationComponent, NgSelectComponent], schemas: [NO_ERRORS_SCHEMA] // 添加这个Schema忽略未知属性/组件 }) .compileComponents(); })); });
这个Schema会让Angular跳过对模板中未知组件、属性的校验,但代价是如果你的模板真的有拼写错误或未导入的依赖,测试也不会报错,不利于长期维护。
补充:为什么运行时正常但测试报错?
运行时你的AppModule已经导入了NgSelectModule,所有相关的组件、指令、管道都被正确注册;但单元测试是独立的隔离环境,默认只会加载你在测试模块里声明/导入的内容,不会继承主应用模块的配置,所以必须在测试模块里单独配置需要的依赖。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

