#javascript #node.js #express #unit-testing #jestjs
Вопрос:
Привет, друзья, в моем тесте я правильно высмеял экспресс-разрешение, но утверждение статуса не выполняется, я не могу найти четкого объяснения. у вас есть какие-либо предложения, спасибо за помощь?
Примечание: ветвь if в getAllusers не является причиной, по которой я ее уже прокомментировал, результат все тот же. но если бы я заменил строку кода в функции getAllusers:
const usersCount = await User.count({})
с:
const usersCount = 2
все тесты пройдены.
каким-то образом вызов двух асинхронных функций внутри getAllUsers вызывает такое поведение???
const bcrypt = require('bcryptjs')
const { User } = require('../models')
const catchAsync = require('../utils/catchAsync')
const AppError = require('../utils/appError')
exports.getAllUsers = catchAsync(async (req, res, next) => {
const { start = 0, limit = 7 } = req.query
const usersCount = await User.count({})
res.set('Access-Control-Expose-Headers', 'X-Total-Count')
res.set('X-Total-Count', `${usersCount}`)
const users = await User.findAll({
attributes: ['id', 'username', 'email', 'role', 'avatar'],
limit: limit * 1,
offset: start * 1
})
if (!usersCount) {
return next(new AppError('no data found', 204))
}
res.status(200).json({
status: 'success',
data: users
})
})
exports.getUser = catchAsync(async (req, res, next) => {
const user = await User.findOne({
attributes: ['id', 'username', 'email', 'role', 'avatar'],
where: {
id: req.params.id * 1
}
})
if (!user) {
return next(new AppError('user not found', 404))
}
res.status(200).json({
status: 'success',
data: user
})
})
exports.deleteUser = catchAsync(async (req, res, next) => {
const user = await User.destroy({
where: {
id: req.params.id * 1
}
})
if (!user) {
return next(new AppError('user not found', 404))
}
res.status(200).json({
status: 'success',
data: user
})
})
exports.updateUser = catchAsync(async (req, res, next) => {
if (req.body.password) {
req.body.password = bcrypt.hashSync(req.body.password, 10)
}
const user = await User.update(
{ ...req.body },
{
where: {
id: req.params.id * 1
},
returning: true
}
)
if (!user[0]) {
return next(new AppError('user not found', 404))
}
const { id, username, email, role, avatar } = user[1][0]
res.status(200).json({
status: 'success',
data: { id, username, email, avatar, role }
})
})
и это испытание:
const userController = require('./userController')
const AppError = require('../utils/appError')
const db = require('../models')
jest.mock('../models')
describe('UserController', () => {
afterEach(() => {
//jest.clearAllMocks()
// Reset to original implementation before each test
})
test('Expect to respond with 200 code and users data', async () => {
const users = [{ username: 'han' }, { username: 'med' }]
db.User.findAll = jest
.fn()
.mockImplementation(() => Promise.resolve([...users]))
db.User.count = jest.fn().mockImplementation(() => Promise.resolve(2))
const req = { query: {} }
const res = {
status: jest.fn(() => res),
json: jest.fn()
}
res.set = jest.fn()
const next = jest.fn()
await userController.getAllUsers(req, res, next)
expect(next).not.toHaveBeenCalled()
expect(res.status).not.toHaveBeenCalled()
expect(db.User.count).toHaveBeenCalledTimes(1)
expect(db.User.count).toHaveBeenCalledWith({})
expect(db.User.findAll).toHaveBeenCalledTimes(1)
expect(db.User.findAll).toHaveBeenCalledWith({
attributes: ['id', 'username', 'email', 'role', 'avatar'],
limit: 7,
offset: 0
})
expect(res.set).toHaveBeenCalledTimes(2)
expect(res.set.mock.calls[0][0]).toBe('Access-Control-Expose-Headers')
expect(res.set.mock.calls[0][1]).toBe('X-Total-Count')
expect(res.set.mock.calls[1][0]).toBe('X-Total-Count')
expect(res.set.mock.calls[1][1]).toBe('2')
expect(res.status).toHaveBeenCalledTimes(1)
expect(res.status).toHaveBeenCalledWith(200)
expect(res.json).toHaveBeenCalledTimes(1)
expect(res.json).toHaveBeenCalledWith({
status: 'success',
data: users
})
})
})