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

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

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

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

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

默认情况下,beforeafter 的块可以应用到文件中的每个测试。 此外可以通过 describe 块来将测试分组。 当 beforeafter 的块在 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. beforeEach(() => {
  13. });
  14. test('Vienna <3 sausage', () => {
  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)。 这是在 beforeafter 处理程序里面 (而不是在 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. console.log('test for describe outer');
  11. expect(true).toEqual(true);
  12. });
  13. describe('describe inner 2', () => {
  14. console.log('describe inner 2');
  15. test('test for describe inner 2', () => {
  16. console.log('test for describe inner 2');
  17. expect(false).toEqual(false);
  18. });
  19. });
  20. console.log('describe outer-c');
  21. });
  22. // describe outer-a
  23. // describe inner 1
  24. // describe outer-b
  25. // describe inner 2
  26. // describe outer-c
  27. // test for describe inner 1
  28. // test for describe outer
  29. // test for describe inner 2

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