Giới Thiệu Chung
Trong phần thứ ba của seri "Tất Tần Tật Về Kiểm Thử Đơn Vị Với Jest", mình sẽ hướng dẫn các bạn cách cài đặt và viết unit test cho một dự án nhỏ, giúp bạn nắm rõ hơn về cách mock hàm nhập khẩu.
Mục Tiêu Của Bài Viết
Bài viết này sẽ chủ yếu tập trung vào các khía cạnh của việc kiểm thử. Mình sẽ lược bỏ qua một số phần như controllers
, models
, và routes
để giảm độ dài bài viết, đồng thời tăng tính tập trung vào các unit test.
Ngoài ra, mình đã cấu hình thêm cors
cho dự án này. Mặc dù không dự định làm gì thêm, mình muốn tạo điều kiện để mọi người có thể clone
dự án và thử nghiệm với các API bằng Postman.
Thông Tin Về Gói Cài Đặt
cors
: "^2.8.5"dotenv
: "^16.4.5"
bash
$ npm install cors@2.8.5 dotenv@16.4.5
Cài Đặt Dự Án
1. Thiết Kế Cơ Sở Dữ Liệu
Mình sẽ tạo một ứng dụng quản lý sách mang tính chất demo. Cơ sở dữ liệu được thiết kế đơn giản với 2 bảng: user
và book
. Mình sẽ sử dụng MySQL để lưu trữ dữ liệu và dùng Sequelize làm ORM cho ứng dụng này.
2. Thiết Lập Kết Nối Cơ Sở Dữ Liệu
Trước tiên, bạn cần cài đặt sequelize-cli
ở chế độ toàn cục:
bash
$ npm install sequelize-cli -g
Sau đó, bạn kiểm tra thư mục hiện tại:
bash
$ pwd
/Users/tienminh/Documents/testing_with_jest
$ cd src/
$ sequelize init
Tiếp theo, hãy tạo file .env
để cấu hình các biến môi trường cần thiết. Đừng quên tạo file .env.example
để cung cấp các tên key cho mọi người.
3. Tạo Models
Chúng ta sẽ tạo các models cho người dùng và sách:
bash
$ sequelize model:generate --name User --attributes email:string,password:string,name:string,mobile_phone:string
$ sequelize model:generate --name Book --attributes user_id:integer,name:string,title:string
Sau khi tạo ra các models, chúng ta cần khai báo mối quan hệ của chúng trong file src/models/book.js
và src/models/user.js
.
4. Tạo Controllers
Chúng ta tạo các controller đơn giản cho User
và Book
chỉ thực hiện hai chức năng là GET
và POST
.
Hiểu Rõ Hơn Về Mocking
1. Caching Module Trong Node.js
Theo tài liệu của Node.js:
Các mô-đun sẽ được lưu cache sau lần đầu tiên chúng được tải.
Nó có nghĩa là khi bạn gọi một hàm nhập khẩu từ một mô-đun trong cùng một file, bạn sẽ luôn nhận được cùng một đối tượng.
2. Cơ Chế Hoạt Động Của Mock Trong Jest
Để mock một hàm đã nhập khẩu, chúng ta sẽ sử dụng hàm jest.mock()
, mà có thể nhận 3 tham số:
moduleName
: đường dẫn đến file cần mock.factory
: (tùy chọn) là một hàm để mock.
3. Cách Mock Hàm Nhập Khẩu
Chúng ta sẽ tạo một ví dụ đơn giản với jest.mock()
trong một file kiểm thử:
javascript
const isEven = require("./isEven.js");
jest.mock("./isEven.js", () => () => true);
Viết Unit Test Cho Controllers
1. Kiểm Thử User
javascript
// src/tests/controllers/user.controller.spec.js
const { createUser, getUser } = require("../../controllers/user.controller.js");
const db = require("../../models/index.js");
jest.mock("../../models/index.js", () => ({
User: { create: jest.fn(), findOne: jest.fn() }
}));
describe("UserController", () => {
// ...
});
2. Kiểm Thử Book
javascript
// src/tests/controllers/book.controller.spec.js
const { createBook, getBook } = require("../../controllers/book.controller.js");
const db = require("../../models/index.js");
jest.mock("../../models/index.js", () => ({
Book: { create: jest.fn(), findAll: jest.fn() }
}));
describe("BookController", () => {
// ...
});
Kết Luận
Chúng ta đã đi sâu vào cách mock các module trong Jest. Hi vọng bài viết đã giúp bạn hiểu rõ hơn về cách viết unit test chất lượng cho các thành phần trong ứng dụng của bạn. Ở phần tiếp theo, chúng ta sẽ khám phá thêm về việc viết unit test cho các class và cách sử dụng spy trong kiểm thử.
Tài Liệu Tham Khảo
source: viblo