typescript 成角单元测试:错误:没有名称为以下的表单控件的值访问器:电话号码

b09cbbtk  于 2023-08-07  发布在  TypeScript
关注(0)|答案(4)|浏览(127)

在我的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数组中,但当我运行我的测试套件时,仍然会得到以下错误。

**错误:没有表单控件的值访问器,其名称为:电话号码

谁能告诉我我做错了什么?

0lvr5msh

0lvr5msh1#

您的providers阵列位于错误的位置:应该是int-phone-prefix拥有NG_VALUE_ACCESSOR,而不是测试模块本身。
最简单的解决方案是为存根IntPhonePrefixComponent存根所需的三个ControlValueAccessor方法(并将provide: NG_VALUE_ACCESSOR // etc.片段移动到其装饰器)。我不是说它是最好的或最优雅的,也许不是。

e0uiprwp

e0uiprwp2#

为了让测试工作,我将我的模拟改为以下内容...

// Mock Component
@Component({
  template: '<input type="text">',
  // tslint:disable-next-line
  selector: 'int-phone-prefix',
  providers: [{
    provide: NG_VALUE_ACCESSOR,
    useExisting: forwardRef(() => IntPhonePrefixComponent),
    multi: true
  }]
})
class IntPhonePrefixComponent {
  constructor() { }
  writeValue(): void {}
  registerOnChange(): void {}
  registerOnTouched(): void {}
}

字符串

webghufk

webghufk3#

将ngDefaultControl添加到int-phone-prefix

eoigrqb6

eoigrqb64#

修复此类失败测试的另一种方法是实现NG_VALUE_ACCESSOR提供程序,同时也从DefaultValueAccessor类进行扩展。看看我的答案从这个其他线程:https://stackoverflow.com/a/76741180/5780536

相关问题