Thực thi một backend sử dụng Express, Mongoose ODM, và Jest (phần 10)

Phát triển và test các hàm dịch vụ

Cho đến bây giờ, chúng ta đã luôn test code bằng cách đặt nó vào trong src/example.js file. Bây giờ, chúng ta sẽ
viết một vài hàm dịch vụ và học làm cách nào viết các test thực sự cho chúng bằng cách sử dụng Jest.

Thiết lập môi trường test

Trước tiên, chúng ta sẽ thiết lập môi trường test của chúng ta bằng cách đi theo các bước sau:
1. Cài đặt jest và mongodb-memory-server như dev dependencies:

$ npm install –save-dev jest@29.7.0 \
mongodb-memory-server@9.1.1

Jest là một cái chạy test sử dụng để định nghĩa và thực thi các unit tests. Thư viện mongodb-memory-server cho phép
chúng ta làm hoạt động các thực thể khởi tạo tươi mới của một CSDL MongoDB, lưu trữ dữ liệu chỉ trong bộ nhớ, nên
chúng ta có thể chạy các tests của chúng ta trên một thực thể khởi tạo CSDL tươi mới.
2. Tạo một thư mục src/test/ để đặt thiết lập cho các tests của chúng ta vào.
3. Trong thư mục này, tạo một src/test/globalSetup.js file, nơi chúng ta sẽ nhập khẩu MongoMemoryServer từ thư viện
cài đặt trước:

import { MongoMemoryServer } from ‘mongodb-memory-server’

4. Bây giờ định nghĩa một hàm globalSetup, cái tạo một server bộ nhớ cho MongoDB:

export default async function globalSetup() {

const instance = await MongoMemoryServer.create({

5. Khi tạo MongoMemoryServer, thiết lập phiên bản nhị phân thành 6.0.4, cái là cùng phiên bản cái chúng ta đã cài
đặt cái chứa Docker của chúng ta:

binary: {
version: ‘6.0.4’,
},

})

6. Chúng ta sẽ lưu giữ thực thể khởi tạo MongoDB như một biến toàn cục để có thể truy cập nó sau này trong hàm
globalTeardown:

global.__MONGOINSTANCE = instance

7. Chúng ta sẽ lưu giữ URL để kết nối tới thực thể khởi tạo test của chúng ta trong biến môi trường DATABASE_URL:

process.env.DATABASE_URL = instance.getUri()

}

8. Biên tập src/db/init.js và điều chỉnh DATABASE_URL đi từ biến môi trường để rằng các tests của chúng ta sẽ sử
dụng CSDL đúng:

export function initDatabase() {

const DATABASE_URL = process.env.DATABASE_URL

9. Ngoài ra, tạo một src/test/globalTeardown.js file để dừng thực thể khởi tạo MongoDB khi các tests của chúng ta
được hoàn thành và thêm code sau bên trong nó:

export default async function globalTeardown() {

await global.__MONGOINSTANCE.stop()

}

10. Bây giờ, tạo một src/test/setupFileAfterEnv.js file. Ở đây, chúng ta sẽ định nghĩa một hàm beforeAll để khởi
tạo kết nối CSDL của chúng ta trong Mongoose trước khi tất cả các tests chạy và một hàm afterAll để ngắt kết nối
từ CSDL sau khi tất cả các tests hoàn thành chạy:

import mongoose from ‘mongoose’
import { beforeAll, afterAll } from ‘@jest/globals’
import { initDatabase } from ‘../db/init.js’
beforeAll(async () => {

await initDatabase()

})
afterAll(async () => {

await mongoose.disconnect()

})

11. Sau đó, tạo một jest.config.json file trong root dự án của chúng ta nơi chúng ta sẽ định nghĩa cấu hình cho các
tests của chúng ta. Trong jest.config.json file, trước tiên chúng ta thiết lập môi trường test thành node:

{

“testEnvironment”: “node”,

12. Tiếp theo, thông báo cho Jest sử dụng các globalSetup, globalTeardown, và setupFileAfterEnv files chúng ta
đã tạo trước kia:

“globalSetup”: “<rootDir>/src/test/globalSetup.js”,
“globalTeardown”: “<rootDir>/src/test/globalTeardown.js”,
“setupFilesAfterEnv”: [“<rootDir>/src/test/setupFileAfterEnv.

js”]
}

Chú ý
Trong trường hợp này, <rootDir> là một string đặc biệt cái tự động được phân giải thành thư mục root bởi Jest.
Bạn không cần điền thủ công vào trong một thư mục root ở đây.
13. Cuối cùng, biên tập package.json file và thêm một test script, cái sẽ chạy Jest:

“scripts”: {

“test”: “NODE_OPTIONS=–experimental-vm-modules jest”,
“lint”: “eslint src”,
“prepare”: “husky install”

},

Chú ý
Tại thời điểm viết, hệ sinh thái Javacript vẫn trong quá trình chuyển tới tiêu chuẩn ECMAScript module (ESM).
Trong các học phần, chúng ta đã sử dụng tiêu chuẩn mới này. Tuy nhiên, Jest không hỗ trợ nó theo mặc định, nên
chúng ta cần truyền tùy chọn –experimental-vm-modules khi chạy Jest.
14. Nếu chúng ta thử chạy script này bây giờ, chúng ta sẽ thấy rằng không có các tests tìm thấy, nhưng chúng ta
vẫn có thể thấy rằng Jest được thiết lập và làm việc đúng đắn:

$ npm test

test
Bây giờ rằng môi trường test của chúng ta đã được thiết lập, chúng ta có thể bắt đầu viết các hàm dịch vụ và các
unit tests. Nó luôn là một ý tưởng tốt để viết các unit tests ngay sau khi viết các hàn dịch vụ, khi nó có nghĩa
chúng ta sẽ có thể debug chúng ngay khỏi trong khi vẫn có hành vi có ý định của chúng tươi mới trong tâm trí chúng
ta.

Chia sẻ