Как выполнить модульное тестирование с помощью Jasmine, когда для FormGroup установлено значение disabled?

#javascript #angular #karma-jasmine

#javascript #angular #карма-jasmine

Вопрос:

У меня есть приложение angular 8, и я использую Jasmine Karma для модульного тестирования. И я хочу протестировать Formbuilder, который отключен в функции ngOnInit:

У меня это так: component.ts

 constructor(
    private dossierService: DossierService,
    private route: ActivatedRoute,
    private sanitizer: DomSanitizer,
    private dossierFileService: DossierFileService,
    private errorProcessor: ErrorProcessor,
    private dialog: MatDialog
  ) {
    this.dossierItems = this.route.snapshot.data.dossierItems;
    this.editDossierForm = this.formBuilder.group({});
    this.editDossierForm.disable();
 
    this.dossier = this.route.snapshot.data.dossier;
    this.dossierItems = route.snapshot.data.dossierItems;
    this.profileImagefile = this.route.snapshot.data.profileImage;
 
    this.editDossierForm = this.formBuilder.group({
      firstName: this.formBuilder.control(this.dossier.firstName, [Validators.required, Validators.maxLength(255)]),
      lastName: this.formBuilder.control(this.dossier.lastName, [Validators.required, Validators.maxLength(255)]),
      mobile: this.formBuilder.control(this.dossier.mobile, [Validators.maxLength(255)]),
      company: this.formBuilder.control(this.dossier.company, [Validators.maxLength(255)]),
      buddy: this.formBuilder.control(this.dossier.buddy, [Validators.maxLength(255)]),
      supervisor: this.formBuilder.control(this.dossier.supervisor, [Validators.maxLength(255)]),
      dateOfBirth: this.formBuilder.control(this.dossier.dateOfBirth)
    });
  }
  ngOnInit(): void {
    this.editDossierForm.disable();
  }
}
  

и это файл спецификации этого:

 
describe('DossierPersonalDataComponent', () => {
  let component: DossierPersonalDataComponent;
  let fixture: ComponentFixture<DossierPersonalDataComponent>;

  beforeEach(async(() => {


    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule, DossierModule, BrowserModule],
      declarations: [DossierPersonalDataComponent],
      providers: [
          DossierFileService,
          ErrorProcessor,
          {
            provide: ActivatedRoute,
            useValue: {
              snapshot: {
                data: {
                  dossier: {
                    firstName: 'hello',
                    lastName: 'world',
                    mobile: '111-111-1111',
                    company: 'carapax',
                    buddy: 'bud',
                    supervisor: 'super',
                    dateOfBirth: '1900-01-01',
                  },
                  dossierItems: [], // mock
                  profileImage: '',
                }
              }
            }
          },
        {
          // DossierFileService, These have to be outside of the braces
          // ErrorProcessor,

          provide: DomSanitizer,
          useValue: {
            sanitize: () => 'safeString',
            bypassSecurityTrustHtml: () => 'safeString'
          }
        }
      ]
    })
      .compileComponents()
      .then(() => {
        fixture = TestBed.createComponent(DossierPersonalDataComponent);
        component = fixture.componentInstance;
      });
  }));


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

  

но в раппорте instanbul coverage это значение остается красным:

   }
  ngOnInit(): void {
    this.editDossierForm.disable();
  }
  

Итак, как охватить эту часть?

Спасибо

оке,

если я сделаю это так:

   it('should create', () => {    
    fixture.detectChanges();
    expect(component).toBeTruthy();
  });

  

Я получаю эту ошибку:

 DossierPersonalDataComponent > should create
TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.
  

и в моей tesspec я вижу это:

  get profileImageUrl() {
    return this.profileImagefile === null
      ? '/assets/placeholder.jpg'
      : this.sanitizer.bypassSecurityTrustUrl(window.URL.createObjectURL(this.profileImagefile));
  }
  

и эта строка:

  ? '/assets/placeholder.jpg'
  

выделено желтым цветом. Ветка не охвачена.

Комментарии:

1. Что я должен изменить?

Ответ №1:

Вам нужно выполнить fixture.detectChanges() . Вызывая это в первый раз, это сработает ngOnInit . После этого он просто запустит обнаружение изменений.

Итак, в зависимости от ваших тестов, вы можете либо включить fixture.detectChanges() внутри beforeEach блока.

Я бы рекомендовал этот подход, только если вы не хотите шпионить или настраивать разные макеты для вещей, происходящих внутри ngOnInit для каждого тестового случая.

Обычно я добавляю это в каждый тестовый пример после объявления своих spys. Итак, ваш тест будет выглядеть примерно так:

 it('should create', () => {
    // spy on anything you would like. e.g the disable call of your form
   
    // then trigger onInit
    fixture.detectChanges();

    // then run your expectations
    expect(component).toBeTruthy();
  });
  

Комментарии:

1. если я сделаю это следующим образом: it(‘should create’, () => { fixture.DetectChanges(); expect(component).toBeTruthy(); }); Я получаю эту ошибку: DossierPersonalDataComponent > должен создать TypeError: не удалось выполнить ‘createObjectURL’ на ‘URL’: не найдена функция, соответствующая предоставленной подписи.

2. Похоже, что в вашей настройке тестового стенда чего-то не хватает. Не могли бы вы, пожалуйста, создать stackblitz и воссоздать вашу проблему? В противном случае трудно помочь.