在软件开发的过程中,测试的重要性就不用多说了。在测试中有些行为是重复性的,比如一些变量/资源的初始化及关闭等。有些操作必须在测试前完成,有些操作则需要在测试结束后被调用。下面介绍如何在JavaScript测试框架Jest中使用Setup/Teardown来实现代码重用。

Jest
beforeEach及afterEach
如果针对不同测试,都需要完成某些初始化工作,就可以使用beforeEach和afterEach。例如:如果测试代码需要连接到服务器才能测试,同时在测试结束后必须要关闭连接的话:
JavaScript
beforeEach(() => {
establishConnection();
});
afterEach(() => {
closeConnection();
});
test('test retrieved data', () => {
// 这时beforeEach会被调用
expect(registered('xxx')).toBeTruthy();
// 这时afterEach会被调用
});
test('test retrieved data 2', () => {
// 这时beforeEach会被调用
expect(registered('yyy')).toBeTruthy();
// 这时afterEach会被调用
});
对于异步调用,同样也可以在beforeEach/afterEach中使用,如果公共方法返回一个Promise,那么在beforeEach中,同样也可以返回一个Promise:
JavaScript
beforeEach(() => {
return establishConnection();
});
beforeAll和afterAll
对于有些初始化工作,针对当前文件中的所有测试,只需要执行一次,这时就可以使用beforeAll/afterAll。
使用describe对测试分组
如果再需要细分的话,还可以使用describe来对测试进行分组:
JavaScript
// 下面方法将会在当前文件的所有测试之前被调用
beforeEach(() => {
return init();
});
describe('matching students to courses', () => {
// 下面的beforeEach仅应用于describe方法内的测试
beforeEach(() => {
return connectToDatabase();
});
test('xxx', () => {
expect(matched('9001', 'Math')).toBe(true);
});
test('yyy', () => {
expect(matched('9002', 'Physics')).toBe(true);
});
});
需要注意的是,上面代码中的init会在connectToDatabase之前被调用。