Mock Functions

https://jestjs.io/docs/mock-functions

Có hai cách để giả lập các hàm: Bằng cách tạo một hàm giả để sử dụng trong mã thử nghiệm hoặc viết một đoạn giả thủ công để ghi đè một phần phụ thuộc vào mô-đun.

Using a mock function

Hãy tưởng tượng chúng ta đang thử nghiệm việc triển khai một hàm forEach, hàm này gọi một hàm gọi lại cho mỗi mục trong một mảng được cung cấp.

function forEach(items, callback) {
  for (let index = 0; index < items.length; index++) {
    callback(items[index]);
  }
}

Để kiểm tra hàm này, chúng ta có thể sử dụng một hàm giả và kiểm tra trạng thái của giả để đảm bảo gọi lại được gọi như mong đợi.

sum.test.js

.mock property

Tất cả các hàm giả đều có thuộc tính .mock đặc biệt này, đây là nơi chứa dữ liệu về cách hàm đã được gọi và những gì hàm trả về được lưu giữ. Thuộc tính .mock cũng theo dõi giá trị của giá trị này cho mỗi cuộc gọi, vì vậy cũng có thể kiểm tra giá trị này:

Các thành viên giả này rất hữu ích trong các bài kiểm tra để xác nhận cách các hàm này được gọi, khởi tạo hoặc những gì chúng trả về:

Mock Return Values

Các hàm giả lập cũng rất hiệu quả trong mã sử dụng kiểu truyền tiếp nối hàm. Mã được viết theo phong cách này giúp tránh sự cần thiết của các đoạn khai phức tạp tạo lại hành vi của thành phần thực mà chúng đang sử dụng, có lợi cho việc đưa các giá trị trực tiếp vào thử nghiệm ngay trước khi chúng được sử dụng.

Mocking Modules

Bây giờ, để kiểm tra phương pháp này mà không thực sự nhấn vào API (và do đó tạo ra các bài kiểm tra chậm và dễ hỏng), chúng ta có thể sử dụng hàm jest.mock (...) để tự động mô phỏng mô-đun axios.

Khi chúng tôi mô phỏng mô-đun, chúng tôi có thể cung cấp một mockResolvedValue cho .get trả về dữ liệu mà chúng tôi muốn thử nghiệm của chúng tôi khẳng định chống lại. Trên thực tế, chúng tôi đang nói rằng chúng tôi muốn axios.get ('/ users.json') trả về một phản hồi giả.

Mock Implementations

Tuy nhiên, vẫn có những trường hợp hữu ích khi vượt ra ngoài khả năng chỉ định giá trị trả về và thay thế toàn bộ việc triển khai một hàm giả. Điều này có thể được thực hiện với jest.fn hoặc phương thức mockImplementationOnce trên các hàm giả.

C:\xampp\htdocs\php\sum.js

C:\xampp\htdocs\php\users.test.js

Phương thức mockImplementation hữu ích khi bạn cần xác định triển khai mặc định của một hàm giả lập được tạo từ một mô-đun khác:

Khi bạn cần tạo lại một hành vi phức tạp của một hàm giả để nhiều lệnh gọi hàm tạo ra các kết quả khác nhau, hãy sử dụng phương thức mockImplementationOnce:

Khi hàm mocked chạy hết các triển khai được xác định bằng mockImplementationOnce, nó sẽ thực thi bộ cài đặt triển khai mặc định với jest.fn (nếu nó được định nghĩa):

Đối với những trường hợp chúng tôi có các phương thức thường được xâu chuỗi (và do đó luôn cần trả về giá trị này), chúng tôi có một API đường để đơn giản hóa điều này dưới dạng một hàm .mockReturnThis () cũng nằm trên tất cả các mô hình:

Mock Names

Bạn có thể tùy chọn cung cấp tên cho các hàm giả của mình, tên này sẽ được hiển thị thay vì "jest.fn ()" trong đầu ra lỗi kiểm tra. Sử dụng điều này nếu bạn muốn có thể nhanh chóng xác định chức năng giả lập báo cáo lỗi trong đầu ra thử nghiệm của bạn.

Custom Matchers

Cuối cùng, để giảm bớt yêu cầu xác nhận cách các hàm giả đã được gọi, chúng tôi đã thêm một số hàm đối sánh tùy chỉnh cho bạn:

These matchers are sugar for common forms of inspecting the .mock property. You can always do this manually yourself if that's more to your taste or if you need to do something more specific:// The mock function was called at least onceexpect(mockFunc.mock.calls.length).toBeGreaterThan(0);// The mock function was called at least once with the specified argsexpect(mockFunc.mock.calls).toContainEqual([arg1, arg2]);// The last call to the mock function was called with the specified argsexpect(mockFunc.mock.calls[mockFunc.mock.calls.length - 1]).toEqual([ arg1, arg2,]);// The first arg of the last call to the mock function was `42`// (note that there is no sugar helper for this specific of an assertion)expect(mockFunc.mock.calls[mockFunc.mock.calls.length - 1][0]).toBe(42);// A snapshot will check that a mock was invoked the same number of times,// in the same order, with the same arguments. It will also assert on the name.expect(mockFunc.mock.calls).toEqual([[arg1, arg2]]);expect(mockFunc.getMockName()).toBe('a mock name');Copy

For a complete list of matchers, check out the reference docs.

Last updated

Was this helpful?