---
description: https://jestjs.io/docs/setup-teardown
---

# Setup and Teardown (ok)

Thông thường, trong khi viết các bài kiểm tra, bạn có một số công việc thiết lập cần phải thực hiện trước khi các bài kiểm tra chạy và bạn có một số công việc hoàn thiện cần phải thực hiện sau khi các bài kiểm tra chạy. Jest cung cấp các chức năng trợ giúp để xử lý việc này.

### Repeating Setup For Many Tests

&#x20;If you have some work you need to do repeatedly for many tests, you can use `beforeEach` and `afterEach`.

Ví dụ, giả sử rằng một số thử nghiệm tương tác với cơ sở dữ liệu của các cities. Bạn có một phương thức khởi tạoCityDatabase () phải được gọi trước mỗi lần kiểm tra này và một phương thức clearCityDatabase () phải được gọi sau mỗi lần kiểm tra này. Bạn có thể làm điều này với:

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

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

test('city database has Vienna', () => {
    expect(isCity('Vienna')).toBeTruthy();
});

test('city database has San Juan', () => {
    expect(isCity('San Juan')).toBeTruthy();
});
```

### One-Time Setup

Trong một số trường hợp, bạn chỉ cần thiết lập một lần ở đầu tệp. Điều này có thể đặc biệt khó chịu khi thiết lập không đồng bộ, vì vậy bạn không thể thực hiện nội tuyến. Jest cung cấp beforeAll và afterAll để xử lý tình huống này.

Ví dụ: nếu cả hai khởi tạoCityDatabase và clearCityDatabase trả về lời hứa và cơ sở dữ liệu thành phố có thể được sử dụng lại giữa các lần kiểm tra, chúng tôi có thể thay đổi mã kiểm tra của mình thành:

```
beforeAll(() => {
  return initializeCityDatabase();
});
afterAll(() => {
  return clearCityDatabase();
});
test('city database has Vienna', () => {
  expect(isCity('Vienna')).toBeTruthy();
});
test('city database has San Juan', () => {
  expect(isCity('San Juan')).toBeTruthy();
});
```

### Scoping

Theo mặc định, các khối trước và sau áp dụng cho mọi thử nghiệm trong tệp. Bạn cũng có thể nhóm các bài kiểm tra lại với nhau bằng cách sử dụng một khối mô tả. Khi chúng ở bên trong khối mô tả, khối trước và khối sau chỉ áp dụng cho các bài kiểm tra trong khối mô tả đó.

Ví dụ, giả sử chúng ta không chỉ có cơ sở dữ liệu thành phố mà còn có cơ sở dữ liệu thực phẩm. Chúng tôi có thể thực hiện các thiết lập khác nhau cho các thử nghiệm khác nhau:

```
// Applies to all tests in this file
beforeEach(() => {
    return initializeCityDatabase();
});
test('city database has Vienna', () => {
    expect(isCity('Vienna')).toBeTruthy();
});
test('city database has San Juan', () => {
    expect(isCity('San Juan')).toBeTruthy();
});

describe('matching cities to foods', () => {
    // Applies only to tests in this describe block
    beforeEach(() => {
        return initializeFoodDatabase();
    });

    test('Vienna <3 veal', () => {
        expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true);
    });

    test('San Juan <3 plantains', () => {
        expect(isValidCityFoodPair('San Juan', 'Mofongo')).toBe(true);
    });
});
```

Lưu ý rằng cấp cao nhất beforeEach được thực thi trước beforeEach bên trong khối mô tả. Nó có thể giúp minh họa thứ tự thực hiện của tất cả các hook.

```
beforeAll(() => console.log('1 - beforeAll'));
afterAll(() => console.log('1 - afterAll'));
beforeEach(() => console.log('1 - beforeEach'));
afterEach(() => console.log('1 - afterEach'));
test('', () => console.log('1 - test'));
describe('Scoped / Nested block', () => {
  beforeAll(() => console.log('2 - beforeAll'));
  afterAll(() => console.log('2 - afterAll'));
  beforeEach(() => console.log('2 - beforeEach'));
  afterEach(() => console.log('2 - afterEach'));
  test('', () => console.log('2 - test'));
});

// 1 - beforeAll
// 1 - beforeEach
// 1 - test
// 1 - afterEach
// 2 - beforeAll
// 1 - beforeEach
// 2 - beforeEach
// 2 - test
// 2 - afterEach
// 1 - afterEach
// 2 - afterAll
// 1 - afterAll
```

### Order of execution of describe and test blocks

Jest thực thi tất cả các trình xử lý mô tả trong một tệp thử nghiệm trước khi nó thực hiện bất kỳ thử nghiệm thực tế nào. Đây là một lý do khác để thực hiện thiết lập và chia nhỏ bên trong trình xử lý trước _và sau_ thay vì bên trong các khối mô tả. Khi các khối mô tả hoàn tất, theo mặc định, Jest chạy tất cả các bài kiểm tra theo thứ tự mà chúng gặp phải trong giai đoạn thu thập, đợi mỗi khối hoàn thành và được thu dọn trước khi tiếp tục.

```
describe('outer', () => {
  console.log('describe outer-a');
  describe('describe inner 1', () => {
    console.log('describe inner 1');
    test('test 1', () => {
      console.log('test for describe inner 1');
      expect(true).toEqual(true);
    });
  });
  console.log('describe outer-b');
  test('test 1', () => {
    console.log('test for describe outer');
    expect(true).toEqual(true);
  });
  describe('describe inner 2', () => {
    console.log('describe inner 2');
    test('test for describe inner 2', () => {
      console.log('test for describe inner 2');
      expect(false).toEqual(false);
    });
  });
  console.log('describe outer-c');
});
// describe outer-a
// describe inner 1
// describe outer-b
// describe inner 2
// describe outer-c
// test for describe inner 1
// test for describe outer
// test for describe inner 2
```

### General Advice

Nếu một bài kiểm tra không đạt, một trong những điều đầu tiên cần kiểm tra là liệu bài kiểm tra có thất bại hay không khi đó là bài kiểm tra duy nhất chạy. Để chỉ chạy một bài kiểm tra với Jest, hãy tạm thời thay đổi lệnh kiểm tra đó thành một bài kiểm tra. Chỉ:

```
test.only('this will be the only test that runs', () => {
  expect(true).toBe(false);
});
test('this test will not run', () => {
  expect('A').toBe('A');
});
```
