Шутливый модульный тест не прошел функцию getAllUsers экспресс-контроллера в издевательском состоянии.статус не вызывается?

#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
    })
  })
})