Testing trong Javascript với Jest (Phần 2)
https://viblo.asia/p/testing-trong-javascript-voi-jest-phan-2-RQqKLqo4Z7z
Last updated
https://viblo.asia/p/testing-trong-javascript-voi-jest-phan-2-RQqKLqo4Z7z
Last updated
Chào các bạn, lại một tháng nữa trôi qua và mình vẫn lại lên đây để chém gió như mọi khi nữa rồi . Sau khi phần 1 ra lò với biết bao sóng gió thì hôm nay mình sẽ tiếp tục cho lên sóng phần 2 của loạt bài viết về Testing trong Javascript với Jest với hy vọng dùng tấm thân nhỏ bé này để giúp các bạn hiểu thêm về Mr. Jest. Bây giờ hãy cùng tìm hiểu thôi nào các bạn.
Như các bạn đã biết, việc code chạy không đồng bộ là điều phổ biến trong JavaScript. Khi bạn có code chạy không đồng bộ, Jest cần biết khi nào đoạn code mà nó đang kiểm tra đã hoàn thành, trước khi nó có thể chuyển sang kiểm tra khác. Jest có một số cách để xử lý điều này.
Một ví dụ điển hình của asynchronus là Promise. Nếu code của bạn sử dụng các Promis hãy return lại một Promise từ hàm test(), và Jest sẽ đợi Promise đó được giải quyết. Nếu Promise bị rejected, hàm test() sẽ tự động thất bại.
Nếu bạn mong đợi một Promise bị rejected, hãy sử dụng hàm .catch
kết hợp thêm expect.assertions();
bên trong hàm test của bạn.
Hoặc bạn cũng có thể dùng expect().resolves hoặc expect().rejects để match với từng trường hợp của Promise mà bạn mong muốn.
Hãy luôn nhớ return expect — nếu bạn bỏ qua câu lệnh return này, thì quá trình test của bạn sẽ hoàn thành trước khi Promise trả về từ checkIsAdult được giải quyết và sẽ không có cơ hội thực hiện các lệnh callback sau đó.
Để viết một hàm test không đồng bộ, hãy sử dụng từ khóa async ở phía trước hàm được truyền trong hàm test(). Ví dụ, với cùng hàm checkIsAdult
ở trên có thể được test với async/ await như sau.
Tương tự các bạn cũng có thể kết hợp async/ await với resolves/ rejects trong hàm test để match với từng case.
Thông thường, trong khi viết test, 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 hàm test chạy và bạn cũng có một số công việc hoàn thiện cần phải thực hiện sau khi các đoạn test chạy xong. Jest cung cấp các chức năng trợ giúp để xử lý việc này.
beforeAll, afterAll: dùng để thiết lập một lần duy nhất cho các hàm test() của bạn.
beforeEach, afterEach: dùng để thiết lập cho mỗi hàm test().
Dưới đây là ví dụ về thứ tự thực thi các hook kể trên.
Mock functions cho phép bạn kiểm tra các liên kết giữa code bằng cách xóa việc implementation thực tế của một hàm, ghi lại các lệnh gọi đến hàm (và các tham số được truyền trong các lệnh gọi đó), nắm bắt các phiên bản của hàm tạo khi được khởi tạo mới và cho phép cấu hình thời gian kiểm tra giá trị trả về.
Có hai cách để mock functions: bằng cách tạo một hàm giả để sử dụng trong test hoặc viết một đoạn manual mock
để ghi đè một module dependency
.
Cách đơn giản nhất để tạo một Mock functions instance là dùng cú pháp thần thánh jest.fn()
.
Ví dụ bạn có 1 hàm forEach sẽ gọi đến 1 callback với mỗi item trong mảng. Để test hàm này thì bạn có thể sử dụng mock function để xác định giá trị mong muốn trả về với mỗi item.
Tất cả các mock function đều có thuộc tính mock , đâ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 nó cho mỗi cuộc gọi, vì vậy cũng có thể kiểm tra giá trị này bằng cách sau.
Các mock function cũng có thể được sử dụng để đưa các giá trị test vào code của bạn trong quá trình thực thi test bằng cách gọi mockReturnValueOnce
:
Để mock một module nào đó chúng ta có thể sử dụng cú pháp
jest.mock('path-to-module')
Ví dụ bạn có một module như bên dưới
Bây giờ bạn muốn test xem quá trình fetch users của bạn có thành công hay không thì đây chính là lúc bạn cần tới mock module.
Sử dụng mockImplementation
khi bạn muốn định nghĩa implementation mặc định của mock function được tạo ra từ module khác.
Vậy là chúng ta đã cùng nhau đi xong chặng đường tìm hiểu về sử dụng Jest trong việc testing các ứng dụng Javascript rồi nhỉ. Mình tin rằng bây giờ các bạn đã có thể tự viết test cho ứng dụng của riêng mình với gần đủ các thể loại test rồi Các bạn thấy đấy, kiến thức thì nó quá là nhiều trong khi chúng ta chỉ như là những giọt nước trong đại dương kiến thức bao la vô ngần ấy. Vậy nên mình suggest các bạn hãy lên trang chủ của Jest để đọc thêm nhé. Chào tạm biệt mọi người và hẹn gặp lại ở các bài viết sau. Còn thở là còn viết nhé