Cách đặt lại chức năng giả Jest đếm số lần gọi trước mỗi bài kiểm tra


82

Tôi mới sử dụng Jest, tôi đang cố gắng sử dụng nó để kiểm tra xem một hàm có được gọi hay không. Tôi nhận thấy mock.calls.length không đặt lại cho mọi bài kiểm tra mà là tích lũy. Làm thế nào tôi có thể đưa nó về 0 trước mỗi bài kiểm tra? Tôi không muốn các bài kiểm tra tiếp theo của mình phụ thuộc vào kết quả của lần trước.

Tôi biết có beforeEach in Jest - tôi có nên sử dụng nó không? Cách tốt nhất để đặt lại mock.calls.length là gì? Cảm ơn bạn.

Một ví dụ về mã:

Sum.js:

import local from 'api/local';

export default {
  addNumbers(a, b) {
    if (a + b <= 10) {
      local.getData();
    }
    return a + b;
  },
};

Sum.test.js

import sum from 'api/sum';
import local from 'api/local';
jest.mock('api/local');

// For current implementation, there is a difference 
// if I put test 1 before test 2. I want it to be no difference

// test 1
test('should not to call local if sum is more than 10', () => {
  expect(sum.addNumbers(5, 10)).toBe(15);
  expect(local.getData.mock.calls.length).toBe(0);
});

// test 2
test('should call local if sum <= 10', () => {
  expect(sum.addNumbers(1, 4)).toBe(5);
  expect(local.getData.mock.calls.length).toBe(1);
});

Câu trả lời:


130

Một cách tôi đã tìm thấy để xử lý nó: xóa chức năng giả sau mỗi bài kiểm tra:

Để thêm vào Sum.test.js:

afterEach(() => {
  local.getData.mockClear();
});

Nếu bạn muốn xóa tất cả các chức năng giả sau mỗi lần kiểm tra, hãy sử dụng clearAllMocks

afterEach(() => {
  jest.clearAllMocks();
});

Tò mò nếu có cách nào để làm điều đó cho tất cả các phương thức của đối tượng bị chế nhạo. Khi tôi thử local.mockClear()nó không hoạt động.
công dân conn

27
Bạn đã thử sử dụng jest.clearAllMocks()chưa? Tài liệu: jestjs.io/docs/en/jest-object#jestclearallmocks
Alex Efremov

@AlexEfremov, Cảm ơn bạn rất nhiều về jest.clearAllMocks()chức năng! Tôi đã sử dụng mockClear()cho jest.mockcác lớp và rõ ràng bằng cách nào đó các mô phỏng vẫn chưa bị xóa hoàn toàn (các lệnh gọi hàm gián điệp bên trong các lớp giả đã không bị xóa). Điều này dẫn đến sai sót trường hợp đối tượng khác biệt thực sự gây phiền nhiễu: Compared values have no visual difference..
Patrick

20

Như @AlexEfremov đã chỉ ra trong các nhận xét. Bạn có thể muốn sử dụng clearAllMockssau mỗi lần kiểm tra:

afterEach(() => {
    jest.clearAllMocks();
});

Hãy nhớ rằng điều này sẽ xóa số lượng cuộc gọi của mọi hàm giả mà bạn có, nhưng đó có lẽ là cách đúng.


8

Bạn có thể định cấu hình Jest để đặt lại mocks sau mỗi lần kiểm tra bằng cách đưa cái này vào jest.config.js:

module.exports = {
  resetMocks: true,
};

Đây là tài liệu cho tham số cấu hình này: https://jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [boolean]

Mặc định: false

Tự động thiết lập lại trạng thái giả trước mỗi bài kiểm tra. Tương đương với việc gọi jest.resetAllMocks () trước mỗi lần kiểm tra. Điều này sẽ dẫn đến việc bất kỳ chế độ giả mạo nào bị xóa các triển khai giả mạo nhưng không khôi phục triển khai ban đầu của chúng.


3
Cảm ơn bạn! Tại sao đây không phải là cài đặt mặc định thực sự khiến tôi bối rối ...
randomor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.