Как смоделировать FormBuilder для Angular модульного тестирования компонентов - PullRequest
0 голосов
/ 06 марта 2020

Я работаю в проекте Angular 9.

У меня есть компонент, который принимает formBuilder в качестве входных данных от родительского компонента. Это мой дочерний компонент (тот, который я тестирую):

export class ChildComponent implements OnInit {
  @Input() parentForm: FormGroup;  //this is coming from the parentComponent

  ngOnInit(): void {
    if (this.parentForm) {
      this.filteredSelectables = this.parentForm
        .get("recipientTypes")
        ...
    }
  }
...

Я хочу написать тесты для этого компонента, но мне нужно создать форму, которую тест может использовать (или мне нужно смоделировать родительский компонент и вернуть нужную форму?)

Я добавил FormBuilder в провайдеры testBed, но до сих пор не могу понять, как создать фиктивную форму, с которой я могу протестировать. Тест «следует создать» проходит успешно, но я не могу проверить ничего другого, потому что parentForm не может быть для них нулевым. Вот мой текущий тест:

describe("ChildComponent", () => {
  let component: ChildComponent;
  let fixture: ComponentFixture<ChildComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ChildComponent, MatAutocomplete],
      providers: [FormBuilder],
      schemas: [CUSTOM_ELEMENTS_SCHEMA]
    })
      .compileComponents()
      .then(() => {
        fixture = TestBed.createComponent(ChildComponent);
        component = fixture.componentInstance;
      });
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ChildComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it("should create", () => {
    expect(component).toBeTruthy();
  });
...

Я пытался создать форму, подобную этой:

component.parentForm = FormBuilder.group({
      recipientTypes: new FormControl(
        {
          value: ["mock"],
          disabled: true
        },
        Validators.required
      )
    });

и добавить ее в beforeEach () или даже внутри самого теста. Но я получаю ошибку.

Я подумал, что, может быть, мне нужно высмеять parentComponent и заставить его отправить formBuilder? Вот мой родительский компонент:

export class ParentComponent implements OnInit, OnDestroy {
  parentForm: FormGroup;

  constructor(
    private router: Router,
    private formBuilder: FormBuilder
  ) {}

  ngOnInit() {
    this.setFormTemplate();
  }

  setFormTemplate() {
    this.templateForm = this.formBuilder.group({
      name: new FormControl(
        {
          value: this.name,
          disabled: true
        },
        Validators.required
      ),
      recipientTypes: new FormControl(
        {
          value: this.recipientTypes,
          disabled: true
        },
        Validators.required
      )
    });
  }
...

Как мне создать formBuilder для моих тестов?

1 Ответ

1 голос
/ 06 марта 2020

Попробуйте:

import { FormBuilder } from '@angular/forms';
....
describe("ChildComponent", () => {
  let component: ChildComponent;
  let fixture: ComponentFixture<ChildComponent>;
  let formBuilder: FormBuilder;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ChildComponent, MatAutocomplete],
      providers: [FormBuilder], // add this as a provider
      schemas: [CUSTOM_ELEMENTS_SCHEMA]
    })
      .compileComponents()
      .then(() => {
        fixture = TestBed.createComponent(ChildComponent);
        component = fixture.componentInstance;
      });
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ChildComponent);
    component = fixture.componentInstance;
    formBuilder = TestBed.get(FormBuilder); // get a handle on formBuilder
    // add the mock data here
    component.parentForm = formBuilder.group({ 
      recipientTypes: new FormControl(
        {
          value: ["mock"],
          disabled: true
        },
        Validators.required
      )
    });
    // this fixture.detectChanges will kick off the ngOnInit
    fixture.detectChanges();
  });

  it("should create", () => {
    expect(component).toBeTruthy();
  });
...