【问题标题】:What is the purpose of `beforeEach` global in Jest?Jest 中“beforeEach”全局的目的是什么?
【发布时间】:2019-08-14 15:31:31
【问题描述】:

我总是发现 Jest-Enzyme 测试用例以 beforeEach 全局开头,类似于以下内容:

describe('TEST BLOCK' () => {
  let wrapper;

  beforeEach(() => {
    wrapper = shallow(<Component />);
  ));
));

beforeEach 全局内的函数在 TEST BLOCK describe 块内的每个测试之前运行。在这种情况下,它会在运行每个测试之前浅渲染Component 并分配给wrapper。我不太清楚为什么我们首先要这样做。我们不是故意减慢测试运行时间吗?渲染一次,分配给wrapper不就好了吗? beforeEach 这里的目的是什么?在测试 React 组件时,beforeEach 是否还有其他用处?

【问题讨论】:

标签: reactjs jestjs enzyme


【解决方案1】:

如果您的代码在多个测试中是通用的,您可以在每个测试运行之前使用beforeEach 进行一些设置以避免重复。在这种情况下,如果您有多个浅挂载Component 的测试,您可以将浅挂载移动到beforeEach,并且每次测试运行时都会挂载该组件。通常,您需要将其与 afterEach 配对,您可以在其中调用 wrapper.unmount()

describe('tests', () => {
  it('does one thing', () => {
    const wrapper = shallow(<Component />);
    // ...test some things
    wrapper.unmount();
  });

  it('does another thing', () => {
    const wrapper = shallow(<Component />);
    // ...test something else
    wrapper.unmount();
  });

  it('does a third thing', () => {
    const wrapper = shallow(<Component />);
    // ...test a third thing
    wrapper.unmount();
  });
});

变成:

describe('tests', () => {
  let wrapper;

  beforeEach(() => {
    wrapper = shallow(<Component />);
  });

  afterEach(() => {
    wrapper.unmount();
  });

  it('does something', () => {
    // ...test something
  });

  it('does something else', () => {
    // ...test something else
  });

  it('does another thing', () => {
    // ...test a third something
  });
});

beforeEach 称为“设置”阶段,afterEach 称为“拆卸”阶段。

我们不是故意减慢测试运行时间吗?

不,因为无论如何你都必须在每次测试中浅挂载组件。

不就是渲染一次,然后赋值给wrapper吗?

在多个测试中保持一个组件(或任何状态)可能会导致测试不稳定,因为(例如)如果测试以不同的顺序运行,您可能会得到不同的结果。任何状态(例如已安装的组件)都应在每次测试之前设置并在每次测试后拆除。这使您的测试彼此完全独立。

【讨论】:

  • 另外有必要了解渲染不能在beforeEachit 之外进行。如果我们只是执行const wrapper = shallow(&lt;Component /&gt;),那么代码将在文件加载期间执行,而不是在测试期间执行。
【解决方案2】:

Jest 文档建议将 beforeEach 用于为每个测试使用特定全局状态的测试,例如,在每个测试运行前重置数据库中的测试数据。

注意以下情况:

如果 beforeEach 在 describe 块内,它会针对 describe 块中的每个测试运行。

使用我们有一个包含测试数据的数据库的相同示例,如果您的测试不需要为每个测试重置测试数据,您可以使用beforeAll 运行一些代码一次,之前运行任何测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 2012-05-20
    • 2019-08-23
    • 1970-01-01
    • 2013-02-07
    • 2019-11-24
    • 2017-09-23
    • 2019-10-03
    相关资源
    最近更新 更多