测试代码的设置与清理

在编写测试时,通常需要在测试运行之前进行一些设置工作,并且需要在测试运行后进行一些完成工作。 Jest提供帮助函数来处理这个。

如果你有一些工作需要多次测试,你可以使用 beforeEach 和 afterEach

例如,假设几个测试与城市的数据库进行交互。你有一个方法 initializeCityDatabase(),每个测试之前必须调用,每个测试之后必须调用clearCityDatabase() 方法。你可以这样做:

beforeEach(()=>{
    initializeCityDatabase();
});
afterEach(
    ()=>{ clearCityDatabase();
});

test('城市数据库有维也纳',()=>{
    expect( isCity('维也纳')).toBeTruthy();
});
test('城市数据库有圣胡安',()=>{
    expect(isCity('圣胡安')).toBeTruthy();
});

beforeEachafterEach 以相同的方式处理异步代码这样测试可以处理异步代码 - 他们可以使用一个 done 参数或返回 promise。例如,ifinitializeCityDatabase() 数据库初始化时解决结束的时候返回一个 promise,我们希望返回这个 promise:

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

在某些情况下,您只需要在文件的开头进行一次设置。当设置是异步时,这可能特别麻烦,所以你不能只是内联。Jest提供 beforeAllafterAll 处理这种情况。 

如果 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 来显示数据。

你可能感兴趣的:(测试代码的设置与清理)