在编写测试时,通常需要在测试运行之前进行一些设置工作,并且需要在测试运行后进行一些完成工作。 Jest提供帮助函数来处理这个。
如果你有一些工作需要多次测试,你可以使用 beforeEach 和 afterEach。
例如,假设几个测试与城市的数据库进行交互。你有一个方法 initializeCityDatabase(),每个测试之前必须调用,每个测试之后必须调用clearCityDatabase() 方法。你可以这样做:
beforeEach(()=>{
initializeCityDatabase();
});
afterEach(
()=>{ clearCityDatabase();
});
test('城市数据库有维也纳',()=>{
expect( isCity('维也纳')).toBeTruthy();
});
test('城市数据库有圣胡安',()=>{
expect(isCity('圣胡安')).toBeTruthy();
});
beforeEach 和 afterEach 以相同的方式处理异步代码这样测试可以处理异步代码 - 他们可以使用一个 done 参数或返回 promise。例如,ifinitializeCityDatabase() 数据库初始化时解决结束的时候返回一个 promise,我们希望返回这个 promise:
beforeEach(()=>{
return initializeCityDatabase();
});
在某些情况下,您只需要在文件的开头进行一次设置。当设置是异步时,这可能特别麻烦,所以你不能只是内联。Jest提供 beforeAll 和 afterAll 处理这种情况。
如果 initializeCityDatabase 和 clearCityDatabase 都返回 promises,并且城市数据库可以在测试之间重复使用,我们可以将测试代码更改为:
beforeAll(()=>{
return initializeCityDatabase();
});
afterAll(()=>{
return clearCityDatabase();
});
test('城市数据库有维也纳',()=>{
expect(isCity('维也纳')).toBeTruthy();
});
test('城市数据库有圣胡安',()=>{
expect(isCity('圣胡安')).toBeTruthy();
});
默认情况下 before 和 after 是适用文件中每个测试。还可以使用 describe 将测试组合在一起。如果测试在 describe 中,那么 before 和 after 只对 describe 中的测试起作用。
假设我们不是只有城市数据,我们还有食物数据,我们要对不同的测试进行不同的设置:
// 适配所有测试
filebeforeEach(()=>{
return initializeCityDatabase();
});
test('城市数据库有维也纳',()=>{
expect(isCity('维也纳')).toBeTruthy();
});
test('城市数据库有圣胡安',()=>{
expect(isCity('圣胡安')).toBeTruthy();
});
describe('匹配城市里的食物',()=>{
// 适配在 describe 里的测试
beforeEach(()=>{
return initializeFoodDatabase();
});
test('维也纳 <3 香肠',()=>{
expect( isValidCityFoodPair('维也纳', '肉片')).toBe(true);
});
test('圣胡安 <3 芭蕉',()=>{
expect(isValidCityFoodPair('圣胡安','油炸芭蕉泥')).toBe(true);
});
});
如果测试失败了,如果一个测试失败,首先要检查的一件事应该是测试是否是唯一的运行失败的测试。
在Jest中,只运行一个测试很简单 - 只需将 test 命令更改为 test.only :
test.only('这个测试将运行',()=>{
expect(true).toBe(false);
});
test('这个测试不会运行',()=>{
expect('A').toBe('A');
});
如果你有一个测试,当它作为一个更大的套件的一部分运行时经常失败,但是当你单独运行它时,并不会失败,所以排除其他测试的干扰是一个很好的选择。你可以通过 beforeEach 清除共享状态来解决此问题。如果你不确定某些共享状态是否被修改,你还可以尝试 beforeEach 来显示数据。