Setup and Teardown
写测试的时候你经常需要在测试运行前做一些准备工作,和在测试运行后进行一些整理工作。 Jest 提供帮助函数来处理这个问题。
为多次测试重复设置 #
如果你有一些需要为多次测试重复设置的工作,你可以使用 beforeEach
和 afterEach
。
比如说,几个与城市数据库进行交互测试。 你必须有在每个测试之前调用方法 initializeCityDatabase()
和每个测试后,必须调用方法 clearCityDatabase()
。 你可以用︰
beforeEach(() => { initializeCityDatabase(); }); afterEach(() => { clearCityDatabase(); }); test('city database has Vienna', () => { expect(isCity('Vienna')).toBeTruthy(); }); test('city database has San Juan', () => { expect(isCity('San Juan')).toBeTruthy(); });
beforeEach
和 afterEach
可以异步代码相同的方式处理该 测试 — — 他们可以采取 done
参数或返回承诺。 例如,如果 initializeCityDatabase()
返回解决数据库初始化时的承诺,我们会想返回这一承诺︰
beforeEach(() => { return initializeCityDatabase(); });
一次性设置 #
在某些情况下,你只需要在文件的开头做一次设置。 当设置是异步的时候可能是特别烦,你不能只在一行做它。 Jest 提供 beforeAll
和 afterAll
处理这种情况。
例如,如果返回的承诺,initializeCityDatabase
和 clearCityDatabase
和城市数据库可以重用测试之间,我们能改变我们的测试代码:
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(); });
范围 #
默认情况下,before
和 after
的块应用到文件中的每个测试。 此外可以组合在一起使用一个 describe
块的测试。 当他们在 describe
块内部,before
和 after
的块只适用于该 describe
块内测试。
比如说,我们不仅仅有一个城市的数据库,还有食品数据库。不同的测试我们可以做不同的设置︰
// Applies to all tests in this file beforeEach(() => { return initializeCityDatabase(); }); test('city database has Vienna', () => { expect(isCity('Vienna')).toBeTruthy(); }); test('city database has San Juan', () => { expect(isCity('San Juan')).toBeTruthy(); }); describe('matching cities to foods', () => { // Applies only to tests in this describe block beforeEach(() => { return initializeFoodDatabase(); }); test('Vienna <3 sausage', () => { expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true); }); test('San Juan <3 plantains', () => { expect(isValidCityFoodPair('San Juan', 'Mofongo')).toBe(true); }); });
一般建议 #
如果测试失败,第一件事要检查测试失败时它是否是唯一运行的测试。 在 Jest 中很容易地运行只有一个测试 — — 只是暂时将该 test
命令更改为 test.only
:
test.only('this will be the only test that runs', () => { expect(true).toBe(false); }); test('this test will not run', () => { expect('A').toBe('A'); });
如果你有一个测试,当它作为一个更大的套件的一部分运行时经常失败,但是当你单独运行它时,并不会失败,所以来自不同测试干扰这个测试是一个很好的选择。 你经常可以修复这通过清除一些与 beforeEach
的共享的状态。 如果您不确定某些共享状态是否被修改,您还可以尝试只记录数据的 beforeEach
。