Angular响应式表单单元测试报错:Error: No value accessor for form control with path: 'orders -> 0 -> produit' 解决求助
Angular响应式表单单元测试报错:Error: No value accessor for form control with path: 'orders -> 0 -> produit' 解决求助
嗨,我来帮你排查这个问题!这个报错的核心原因很明确:你的单元测试环境没有导入MatSelectModule。
你模板里的produit字段用了<mat-select>组件,这个组件依赖Angular Material的MatSelectModule来提供表单控件的ValueAccessor(也就是Angular用来和表单控件交互的核心接口)。测试环境里如果没导入这个模块,Angular就找不到对应控件的访问器,自然会抛出这个路径错误。
之前你把FormArray改成空数组后测试能通过,只是因为此时*ngFor不会渲染第一个表单组里的mat-select,相当于避开了缺失模块的问题,并不是真正解决了根源。
具体修复步骤:
- 首先在测试文件顶部导入必要的Material模块(
mat-select依赖MatSelectModule,而它嵌套的mat-form-field需要MatFormFieldModule):
import { MatSelectModule } from '@angular/material/select'; import { MatFormFieldModule } from '@angular/material/form-field';
- 然后在测试的
createComponentFactory配置的imports数组里添加这两个模块:
const createComponent = createComponentFactory({ component: OrderFormComponent, imports: [ ReactiveFormsModule, TestHelperModule, MatIconModule, MatInputModule, MatFormFieldModule, // 新增 MatSelectModule, // 新增 ], // ... 其他配置项 });
这样测试环境就能正确识别mat-select组件,为produit表单控件提供对应的ValueAccessor,报错就会消失啦。另外提个小建议:你的模板里给formArrayName所在的div加了ngDefaultControl,这个属性是给原生表单元素用的,formArrayName指令完全不需要它,你可以把它删掉,避免不必要的混淆。
备注:内容来源于stack exchange,提问作者Olivier
相关产品推荐
相关产品推荐

