January 26, 2016

Dễ dàng giả lập HTTP với module Nock trong NodeJS

source: https://cms-assets.tutsplus.com/uploads/users/487/posts/22836/final_image/http-mock-test.png
Theo kế hoạch đặt ra, và phải đẩy thật mạnh blog cho năm nay, nên trước khi Tết Tết cái con Khỉ nó kéo về, làm tinh thần xuống, và sau khi Tết nó qua thì cũng làm tinh thần không nhanh chóng khôi phục, thì làm theo bài blog này, ghi chú lại việc giả lập HTTP trong NodeJS nhằm thực hiện test. (Haiz, số là dạo gần đây bị cái TDD nó đè nên hành xác bu theo đắm đuối)

Mục tiêu và tại sao lại giả lập HTTP, và có tác dụng gì cho việc unit test - TDD. Đơn giản là, hiện tại mình đang viết vài project NodeJS theo cơ chế "thông" nhau bởi API. Unit test vốn dĩ là isolated test, có nghĩa là cô lập nó lại mà test. Nên mình cần giả lập (mock) http response từ API server, rồi tiếp đó mình chỉ tập trung viết code cho client là đủ (không thèm biết API nó mần sao, chỉ cần giả lập những response như nó mô tả là đủ)

Cài đặt

npm install nock --save-dev

Đoạn code thực hiện gọi API


Ở đây, mình dùng module request để thực hiện gọi API (trong code demo thì là localhost:8080) với phương thức GET. Khi response thành công, mình sẽ parse JSON rồi trả kết quả ra bên ngoài. Đoạn code này, mọi người nhìn vào cũng sẽ hiểu mình đóng gói nó thành module trong NodeJS để dễ sử dụng sau này.

Đoạn code thực hiện test


Ở đây, mình dùng Sinon để theo dõi (spy) xem có đúng là mình dùng module request và gọi method GET hay không. Và mình dùng Nock để giả lập HTTP như đoạn code từ dòng 22 đến dòng 26. Bạn sẽ thấy có dòng nock.cleanAll(); - cái này dùng để xóa sạch những cấu hình mock HTTP (nếu có) trước đó, tránh bị nhầm lẫn và rối việc, khiến việc test của bạn bị sai mà không biết sai từ đâu.

Vậy là xong, cái này cũng dễ làm, nhưng thiếu nó khiến bạn khó mà thực hiện isolated test khi gặp tình huống tương tự. Chia sẻ tí kinh nghiệm, hy vọng hữu ích ^_^

Testing with mocha and chaijs
Sinon - Solved method already wrapped

No comments:

Post a Comment