玩笑:将变量直接放入描述块与 beforeAll 中

Gle*_*mad 5 testing jestjs

我知道在测试之间共享状态是不好的做法,如果可能的话应该避免。但我只是好奇下面这两个结构在 Jest 中有何不同:

描述块

describe('test suite', () => {
  const theAnswer = 42;

  test('a test case', () => {
    expect(theAnswer + 1).toEqual(43);
  });

  test('another test case', () => {
    expect(theAnswer + -1).toEqual(41);
  });
});
Run Code Online (Sandbox Code Playgroud)

全部之前

describe('test suite with beforeAll', () => {
  let theAnswer;
  beforeAll(() => {
    theAnswer = 42;
  });

  test('a test case', () => {
    expect(theAnswer + 1).toEqual(43);
  });

  test('another test case', () => {
    expect(theAnswer + -1).toEqual(41);
  });
});
Run Code Online (Sandbox Code Playgroud)

beforeAll如果我们可以直接在块中声明共享变量/状态,那么使用的意义是什么describe

sli*_*wp2 5

来自文档一次性设置

当设置是异步的时,这可能特别麻烦,因此您无法内联执行此操作。Jest 提供了beforeAll处理afterAll这种情况的方法。

如果设置像您一样是同步的,则在块中声明变量describe就可以了。

如果安装是同步的,则无需beforeAll. 关键是 Jest 将等待承诺解决,因此您也可以进行异步设置。

但如果设置是异步的,则无法在describe块内进行。before*你必须用钩子来做after*

例如

describe('test suite', () => {
  let theAnswer;
  beforeAll((done) => {
    setTimeout(() => {
      theAnswer = 42;
      done();
    }, 1_000);
  });

  test('a test case', () => {
    expect(theAnswer + 1).toEqual(43);
  });

  test('another test case', () => {
    expect(theAnswer + -1).toEqual(41);
  });
});
Run Code Online (Sandbox Code Playgroud)

Jest 将等待设置完成后再运行测试用例。

请参阅有关beforeAll 的文档