在我的Angular组件中,我使用了一个第三方组件,它是表单的一部分,一个简化的模板看起来像这样:
<form novalidate autofill="off" [formGroup]="addPhoneForm">
<div>
<int-phone-prefix [locale]="'en'" [defaultCountry]="'us'" formControlName="phoneNumber"></int-phone-prefix>
</div>
<div>
<input type="text"formControlName="phoneName">
</div>
</form>
字符串
一切都很好...直到为我的组件的方法编写测试的时候。我知道我需要模拟第三方组件,以防止它抱怨组件不是已知元素。我也不想不使用[NO_ERRORS_SCHEMA]
,因为第三方组件是我的FormGroup
的一部分。因此,在我的测试文件中,我在设置测试套件之前添加了一个mock,请注意我如何将formControlName
添加到mock模板,如何将mock添加到declarations
数组,以及如何在providers
数组中使用forwardRef
,以便将mock视为表单的一部分。
// Mock Component
@Component({
template: '<input type="text" formControlName="phoneNumber">',
// tslint:disable-next-line
selector: 'int-phone-prefix',
})
class IntPhonePrefixComponent {
constructor() { }
}
describe('AddPhoneComponent', () => {
let component: AddPhoneComponent;
let fixture: ComponentFixture<AddPhoneComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AddPhoneComponent, IntPhonePrefixComponent],
imports: [
FormsModule,
ReactiveFormsModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => IntPhonePrefixComponent),
}
]
})
.compileComponents();
}));
型
然而,尽管有mock并将其包含在我的providers数组和declarations数组中,但当我运行我的测试套件时,仍然会得到以下错误。
**错误:没有表单控件的值访问器,其名称为:电话号码
谁能告诉我我做错了什么?
4条答案
按热度按时间0lvr5msh1#
您的
providers
阵列位于错误的位置:应该是int-phone-prefix
拥有NG_VALUE_ACCESSOR
,而不是测试模块本身。最简单的解决方案是为存根
IntPhonePrefixComponent
存根所需的三个ControlValueAccessor
方法(并将provide: NG_VALUE_ACCESSOR // etc.
片段移动到其装饰器)。我不是说它是最好的或最优雅的,也许不是。e0uiprwp2#
为了让测试工作,我将我的模拟改为以下内容...
字符串
webghufk3#
将ngDefaultControl添加到int-phone-prefix
eoigrqb64#
修复此类失败测试的另一种方法是实现NG_VALUE_ACCESSOR提供程序,同时也从DefaultValueAccessor类进行扩展。看看我的答案从这个其他线程:https://stackoverflow.com/a/76741180/5780536