Định nghĩa test cases cho hàm dịch vụ createPost
Để test liệu hàm createPost có làm việc như mong đợi, chúng ta sẽ định nghĩa unit test cases cho nó sử dụng Jest:
1. Tạo một thư mục src/__tests__/ mới, cái sẽ chứa tất cả các định nghĩa test.
Chú ý
Như lựa chọn, các test files cũng có thể là cùng vị trí với các files liên quan cái chúng đang test. Tuy nhiên,
trong các học phần, chúng ta sử dụng thư mục __tests__ để làm nó dễ dàng hơn phân biệt các tests khỏi các files
khác.
2. Tạo một src/__tests__/posts.test.js file mới cho các tests của chúng ta liên quan tới các posts. Trong file này,
bắt đầu bằng cách nhập khẩu mongoose và các hàm describe, expect, và test từ @jest/globals:
import mongoose from ‘mongoose’
import { describe, expect, test } from ‘@jest/globals’
3. Cũng nhập khẩu hàm createPost từ các dịch vụ của chúng ta và Post model:
import { createPost } from ‘../services/posts.js’
import { Post } from ‘../db/models/post.js’
4. Sau đó, sử dụng hàm describe() để định nghĩa một test mới. Hàm này mô tả một nhóm các tests. Chúng ta có thể
gọi nhóm của chúng ta creating posts:
describe(‘creating posts’, () => {
5. Bên trong nhóm, chúng ta sẽ định nghĩa một test bằng cách sử dụng hàm test(). Chúng ta có thể truyền một hàm
không đồng bộ ở đây để có thể sử dụng cú pháp async/await. Chúng ta gọi test đầu tiên creating posts with all
parameters should succeed:
test(‘with all parameters should succeed’, async () => {
6. Bên trong test này, chúng ta sẽ sử dụng hàm createPost để tạo một post mới với một vài tham số:
const post = {
title: ‘Hello Mongoose!’,
author: ‘Daniel Bugl’,
contents: ‘This post is stored in a MongoDB database usingMongoose.’,
tags: [‘mongoose’, ‘mongodb’],
}
const createdPost = await createPost(post)
7. Sau đó, thẩm định rằng nó trả về một post với một ID bằng cách sử dụng hàm expect() từ Jest và cái khớp
toBeInstanceOf để thẩm định rằng nó là một ObjectId:
expect(createdPost._id).toBeInstanceOf(mongoose.Types.
ObjectId)
8. Bây giờ sử dụng Mongoose trực tiếp để tìm ra post với ID đã cho:
const foundPost = await Post.findById(createdPost._id)
9. Chúng ta expect() foundPost để làm bằng một object chứa ít nhất các đặc tính của object post gốc chúng ta đã
định nghĩa. Ngoài ra, chúng ta mong đợi post được tạo có createdAt và updatedAt timestamps:
expect(foundPost).toEqual(expect.objectContaining(post))
expect(foundPost.createdAt).toBeInstanceOf(Date)
expect(foundPost.updatedAt).toBeInstanceOf(Date)})
10. Ngoài ra, định nghĩa một test thứ hai, gọi là creating posts without title should fail. Khi chúng ta định nghĩa
title sẽ được yêu cầu, nó không nên là có thể tạo một post mà không một cái:
test(‘without title should fail’, async () => {
const post = {
author: ‘Daniel Bugl’,
contents: ‘Post with no title’,
tags: [’empty’],}
11. Sử dụng một construct try/catch để bắt lỗi và expect() lỗi là một Mongoose ValidationError, cái thông báo
cho chúng ta rằng title được yêu cầu:
try {
await createPost(post)
} catch (err) {
expect(err).toBeInstanceOf(mongoose.Error.ValidationError)
expect(err.message).toContain(‘`title` is required’)
}})
12. Cuối cùng, làm một test gọi là creating posts with minimal parameters should succeed và chỉ nhập title:
test(‘with minimal parameters should succeed’, async () => {
const post = {
title: ‘Only a title’,
}
const createdPost = await createPost(post)
expect(createdPost._id).toBeInstanceOf(mongoose.Types.ObjectId)
})
})
13. Bây giờ rằng chúng ta đã định nghĩa các tests của chúng ta, chạy script chúng ta đã định nghĩa trước kia:
$ npm test
Như chúng ta có thể thấy, sử dụng các unit tests chúng ta có thể làm các tests tách biệt trên các hàm dịch vụ
của chúng ta mà không phải định nghĩa và truy cập thử công các routes hay viết các thiết lập test thủ công. Các
tests này cũng có lợi thế thêm vào rằng khi chúng ta thay đổi code sau này, chúng ta có thể đảm bảo rằng hành vi
định nghĩa trước không thay đổi bằng cách chạy lại các tests.
