在Jest中,定义全局变量是否与它们在BeforeAll中定义相同?

时间:2017-12-20 19:32:50

标签: javascript unit-testing jest

使用 Jest 编写单元测试时。为什么要使用 beforeAll 而不是简单地将值直接赋值给全局变量,反之亦然?

例如,以下两个片段之间有什么区别?

Snippet 1

const mock = { key1: 'val1', key2: 'val2' };

describe('Test Cases', () => {
  test('Case 1', () => {
    // tests that use mock variable
  });

  test('Case 2', () => {
    // more tests that use mock variable
  });
});

Snippet 2

const mock = {};

beforeAll(() => {
  mock.key1 = 'val1';
  mock.key2 = 'val2';
});

describe('Test Cases', () => {
  test('Case 1', () => {
    // tests that use mock variable
  });

  test('Case 2', () => {
    // more tests that use mock variable
  });
});

1 个答案:

答案 0 :(得分:4)

在您的示例中,它没有任何区别。但是,有些情况下使用 beforeAll 是有意义的:如果你有异步代码,那么返回promises的函数。

如果您从 beforeAll 回调中返回承诺,则可以在测试中轻松测试承诺最终解析的值。

引用Jest documentation

  

在某些情况下,您只需要在文件开头设置一次。当设置是异步的时,这可能特别麻烦,因此您不能直接进行此操作。 Jest提供 beforeAll 和afterAll来处理这种情况。   例如,如果 initializeCityDatabase clearCityDatabase 都返回了promises,并且城市数据库可以在测试之间重用,我们可以将测试代码更改为:

beforeAll(() => {
    return initializeCityDatabase();
});

afterAll(() => {
    return clearCityDatabase();
});

test('city database has Vienna', () => {
    expect(isCity('Vienna')).toBeTruthy();
});

test('city database has San Juan', () => {
    expect(isCity('San Juan')).toBeTruthy();
});