安装和移除

    如果你有一些要为多次测试重复设置的工作,你可以使用 和 afterEach

    例如,我们考虑一些与城市信息数据库进行交互的测试。 你必须在每个测试之前调用方法 initializeCityDatabase() ,同时必须在每个测试后,调用方法 clearCityDatabase()。 你可以这样做:

    beforeEachafterEach 能够通过与异步代码测试 相同的方式处理异步代码 — — 他们可以采取 done 参数或返回一个 promise。 例如,如果 initializeCityDatabase() 返回解决数据库初始化时的 promise ,我们会想返回这一 promise︰

    1. beforeEach(() => {
    2. return initializeCityDatabase();
    3. });

    例如,如果 initializeCityDatabaseclearCityDatabase 都返回了 promise ,城市数据库可以在测试中重用,我们就能把我们的测试代码改成这样:

    默认情况下,beforeAllafterAll 的块会应用到文件中的每个测试。 此外可以通过 describe 块来将测试分组。 当 beforeAllafterAll 的块在 describe 块内部时,则其只适用于该 describe 块内的测试。

    比如说,我们不仅有一个城市的数据库,还有一个食品数据库。 我们可以为不同的测试做不同的设置︰

    1. // Applies to all tests in this file
    2. beforeEach(() => {
    3. return initializeCityDatabase();
    4. });
    5. test('city database has Vienna', () => {
    6. expect(isCity('Vienna')).toBeTruthy();
    7. });
    8. expect(isCity('San Juan')).toBeTruthy();
    9. });
    10. describe('matching cities to foods', () => {
    11. // Applies only to tests in this describe block
    12. return initializeFoodDatabase();
    13. });
    14. test('Vienna <3 veal', () => {
    15. expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true);
    16. });
    17. test('San Juan <3 plantains', () => {
    18. expect(isValidCityFoodPair('San Juan', 'Mofongo')).toBe(true);
    19. });
    20. });

    Jest 会在所有真正的测试开始之前执行测试文件里所有的 describe 处理程序(handlers)。 这是在 before*after* 处理程序里面 (而不是在 describe 块中)进行准备工作和整理工作的另一个原因。 当 describe 块运行完后,,默认情况下,Jest 会按照 test 出现的顺序(译者注:原文是in the order they were encountered in the collection phase)依次运行所有测试,等待每一个测试完成并整理好,然后才继续往下走。

    考虑以下示例测试文件和输出:

    1. describe('outer', () => {
    2. console.log('describe outer-a');
    3. describe('describe inner 1', () => {
    4. console.log('describe inner 1');
    5. test('test 1', () => {
    6. console.log('test for describe inner 1');
    7. expect(true).toEqual(true);
    8. });
    9. console.log('describe outer-b');
    10. test('test 1', () => {
    11. console.log('test for describe outer');
    12. expect(true).toEqual(true);
    13. });
    14. describe('describe inner 2', () => {
    15. console.log('describe inner 2');
    16. test('test for describe inner 2', () => {
    17. console.log('test for describe inner 2');
    18. expect(false).toEqual(false);
    19. });
    20. });
    21. console.log('describe outer-c');
    22. });
    23. // describe outer-a
    24. // describe inner 1
    25. // describe outer-b
    26. // describe inner 2
    27. // describe outer-c
    28. // test for describe inner 1
    29. // test for describe outer

    如果测试失败,第一件要检查的事就是,当仅运行这条测试时,它是否仍然失败。 To run only one test with Jest, temporarily change that test command to a test.only: