【问题标题】:Enzyme simulate('change') on select does not increase func coverage选择上的酶模拟(“更改”)不会增加功能覆盖率
【发布时间】:2023-03-04 21:08:01
【问题描述】:

我有一个组件,里面有一个选择

<select onChange={this.handleChange}>
    {this.props.options.map(this.renderOption)}
</select>

还有下面的函数

handleChange(e) {
    const element = e.target;
    this.props.onChange.call(null, e, {
        value: element.value,
        label: element.options[element.selectedIndex].textContent,
    });
}

我在 JestEnzyme 中编写了一个测试,如下所示:

const onChange = jest.fn();
// ....
component.find('select').simulate('change');
expect(onChange).toHaveBeenCalled();

问题是我的 % Funcs 覆盖率在此测试中为 83.33%,因为它认为 handleChange 函数没有被调用。除此之外,所有其他覆盖率(% Stmts、% Branch、% Lines)均为 100%。这是一个酶/开玩笑的错误,还是我做错了什么?

PS:我尝试编写一个虚拟测试,我会手动调用handleChange,并且覆盖率达到 100%。所以,这肯定与此有关。

编辑,澄清:正在调用handleChange 函数,测试有效。问题是覆盖并没有计算函数被调用。

【问题讨论】:

  • 尝试将sinon 添加到您的测试文件并监视组件。 sinon.spy(component.prototype, 'handleChange'); 在使用 shallow() 创建组件包装器之前添加此内容@
  • @KyleRichardson 这有什么帮助? sinon 会将函数标记为已覆盖,还是什么?
  • 看看这个:sinonjs.org。您正在尝试做的是 sinon 的设计目的。
  • @KyleRichardson 但是,正在调用该函数,测试有效。问题是覆盖率不计算函数被调用。
  • 对不起,我误会了。不完全确定在这种情况下如何提供帮助。

标签: unit-testing reactjs code-coverage enzyme jestjs


【解决方案1】:

我发现了这个案子对我来说是什么。

SelectComponent.defaultProps = {
    options: [],
    onChange: () => {},
};

这是因为默认的属性函数。当我进行单元测试时,我将其替换为一个模拟函数,因此该函数从未被调用,因此覆盖率不计其数。

【讨论】:

  • 对我来说,在测试中实际调用默认函数至关重要。所以仅仅检查onChange 不为空是不够的,我必须调用onChange()
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 2018-09-20
  • 2018-09-11
  • 1970-01-01
  • 2018-11-28
  • 2019-01-16
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多