安装和移除
如果你有一些要为多次测试重复设置的工作,你可以使用 和 afterEach
。
例如,我们考虑一些与城市信息数据库进行交互的测试。 你必须在每个测试之前调用方法 initializeCityDatabase()
,同时必须在每个测试后,调用方法 clearCityDatabase()
。 你可以这样做:
beforeEach
和 afterEach
能够通过与异步代码测试 相同的方式处理异步代码 — — 他们可以采取 done
参数或返回一个 promise。 例如,如果 initializeCityDatabase()
返回解决数据库初始化时的 promise ,我们会想返回这一 promise︰
beforeEach(() => {
return initializeCityDatabase();
});
例如,如果 initializeCityDatabase
和 clearCityDatabase
都返回了 promise ,城市数据库可以在测试中重用,我们就能把我们的测试代码改成这样:
默认情况下,beforeAll
和 afterAll
的块会应用到文件中的每个测试。 此外可以通过 describe
块来将测试分组。 当 beforeAll
和 afterAll
的块在 describe
块内部时,则其只适用于该 describe
块内的测试。
比如说,我们不仅有一个城市的数据库,还有一个食品数据库。 我们可以为不同的测试做不同的设置︰
// Applies to all tests in this file
beforeEach(() => {
return initializeCityDatabase();
});
test('city database has Vienna', () => {
expect(isCity('Vienna')).toBeTruthy();
});
expect(isCity('San Juan')).toBeTruthy();
});
describe('matching cities to foods', () => {
// Applies only to tests in this describe block
return initializeFoodDatabase();
});
test('Vienna <3 veal', () => {
expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true);
});
test('San Juan <3 plantains', () => {
expect(isValidCityFoodPair('San Juan', 'Mofongo')).toBe(true);
});
});
Jest 会在所有真正的测试开始之前执行测试文件里所有的 describe 处理程序(handlers)。 这是在 before*
和 after*
处理程序里面 (而不是在 describe 块中)进行准备工作和整理工作的另一个原因。 当 describe 块运行完后,,默认情况下,Jest 会按照 test 出现的顺序(译者注:原文是in the order they were encountered in the collection phase)依次运行所有测试,等待每一个测试完成并整理好,然后才继续往下走。
考虑以下示例测试文件和输出:
describe('outer', () => {
console.log('describe outer-a');
describe('describe inner 1', () => {
console.log('describe inner 1');
test('test 1', () => {
console.log('test for describe inner 1');
expect(true).toEqual(true);
});
console.log('describe outer-b');
test('test 1', () => {
console.log('test for describe outer');
expect(true).toEqual(true);
});
describe('describe inner 2', () => {
console.log('describe inner 2');
test('test for describe inner 2', () => {
console.log('test for describe inner 2');
expect(false).toEqual(false);
});
});
console.log('describe outer-c');
});
// describe outer-a
// describe inner 1
// describe outer-b
// describe inner 2
// describe outer-c
// test for describe inner 1
// test for describe outer
如果测试失败,第一件要检查的事就是,当仅运行这条测试时,它是否仍然失败。 To run only one test with Jest, temporarily change that test
command to a test.only
: