Как правильно вызвать функцию из модульного теста

При запуске теста покрытия кода он говорит, что функция clearAllValues ​​не выполняется в тесте, но я вызываю эту функцию в своих тестах ниже.

покрытие кода

тесты

it('clearAllValues should be called by click', () => {
  spyOn(component, 'clearAllValues');
  const button = fixture.debugElement.query(By.css('.clearAllValuesBtn')).nativeElement;
  button.click();
  fixture.whenStable().then(() => {
    expect(component.clearAllValues).toHaveBeenCalled();
    expect(component.value).toEqual('');
    expect(component.allowReset).toEqual(false);
    expect(component.term).toEqual('');
  });
});

it('should call clearAllValues function', () => {
  spyOn(component, 'clearAllValues');
  component.clearAllValues();
  expect(component.clearAllValues).toHaveBeenCalled();
});

составная часть

clearAllValues = () => {
  this.value = '';
  this.allowReset = false;
  this.term = '';
}

person derrickrozay    schedule 30.08.2019    source источник
comment
Проверьте это stackoverflow .com/questions/45502462/   -  person prabhatojha    schedule 30.08.2019
comment
Вы пробовали fixture.detectChanges(); перед expecttations?   -  person lealceldeiro    schedule 02.09.2019


Ответы (1)


В модульном тестировании при тестировании определенного метода/функции мы не всегда можем захотеть вызывать все другие зависимые методы/функции. Jasmine предоставляет для таких целей функцию spyOn().

В соответствии с этим определением нам нужно использовать только spy для вашего первого теста. Когда кнопка нажата, мы просто хотим узнать, была ли вызвана clearAllValues. Нас не волнует, что на самом деле делает функция. Эту часть можно проверить отдельно. См. документы, чтобы узнать, когда вам нужно использовать шпионов.

В вашем первом тесте clearAllValues should be called by click вам нужно сделать именно это, то есть проверить, был ли вызван clearAllValues. Вам нужно использовать шпион для этого теста, чтобы узнать, была ли вызвана функция или нет.

it('clearAllValues should be called by click', () => {
    const button = fixture.debugElement.query(By.css('.clearAllValuesBtn')).nativeElement;
    spyOn(component, 'clearAllValues');
    button.click();
    fixture.whenStable().then(() => {
        expect(component.clearAllValues).toHaveBeenCalled();
    });
});

Затем, когда вы на самом деле тестируете clearAllValues, вам нужно проверить, установлены ли ваши переменные или нет.

it('should clear values when clearAllValues is called', () => {
    component.clearAllValues();
    expect(component.value).toEqual('');
    expect(component.allowReset).toBeFalsy();
    expect(component.term).toEqual('');
});
person nash11    schedule 30.08.2019
comment
clearAllValues should be called by click' не работает - person derrickrozay; 02.09.2019