【问题标题】:How to correctly call function from unit test如何从单元测试中正确调用函数
【发布时间】:2020-01-03 06:12:46
【问题描述】:

运行代码覆盖率测试时,它说函数 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 = '';
}

【问题讨论】:

标签: angular jasmine karma-jasmine karma-coverage


【解决方案1】:

在单元测试中,在测试特定方法/函数时,我们可能并不总是希望调用所有其他相关的方法/函数。 Jasmine 为此提供了spyOn() 函数。

根据此定义,我们只需要在您的第一次测试中使用spy。当按钮被点击时,我们只想知道clearAllValues 是否被调用,我们并不关心这个函数实际上做了什么。该部分可以单独测试。请参阅docs 了解何时需要使用间谍。

在您的第一个测试clearAllValues should be called by click 中,您需要这样做,即检查是否调用了clearAllValues。您需要使用 spy 进行此测试,以了解该函数是否被调用。

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('');
});

【讨论】:

  • clearAllValues should be called by click' 不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2017-11-20
  • 2021-11-10
  • 2021-04-29
相关资源
最近更新 更多