最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

TypeError:在 vitest 中模拟 sequelize 模型时,User.findOne 不是一个函数

网站源码admin38浏览0评论

TypeError:在 vitest 中模拟 sequelize 模型时,User.findOne 不是一个函数

TypeError:在 vitest 中模拟 sequelize 模型时,User.findOne 不是一个函数

我正在尝试为使用 Sequelize ORM 的

auth.service.js
模块运行一些 Jest 测试。但是,当我运行测试时,出现以下错误:

FAIL  tests/modules/auth/auth.service.test.js > AuthService > login > should login user and return token
TypeError: User.findOne is not a function

这是

AuthService

的代码
const User = require('../../db/models/User');
 const AuthService =  {
  doLogin: async (requestBody) => {
    const { email, password } = requestBody;
    const user = await User.findOne({ where: { email } });
    // rest of the code
  }
}


module.exports = AuthService;

这是测试代码,

import { describe, it, expect, vi, afterEach } from 'vitest';
import bcrypt from 'bcryptjs';
import SequelizeMock from 'sequelize-mock';

const { faker } = require('@faker-js/faker');

const AuthService = require('../../../src/modules/auth/auth.service');
const JwtService = require('../../../src/modules/auth/jwt.service');

vi.mock('../../../src/db/models/User', async () => {
  const dbMock = new SequelizeMock();
  const fakeUser = {
    id: 1,
    phone: faker.phone.phoneNumber('##########'),
    password: faker.internet.password(8),
  };
  const UserMock = dbMock.define('User', fakeUser);
  return UserMock;
});

describe('AuthService', () => {
  afterEach(() => {
    vi.restoreAllMocks();
  });

  describe('login', () => {
    it('should login user and return token', async () => {
      // Arrange
      const requestBody = {
        phone: faker.phone.phoneNumber('##########'),
        password: faker.internet.password(8),
      };
      const fakeUser = {
        id: faker.datatype.uuid(),
        role: faker.datatype.string(4),
      };
      const fakeAccessToken = 'fake-access-token';
      vi.spyOn(bcrypt, 'compareSync').mockImplementation(() => true);
      vi.spyOn(JwtService, 'generateJWT').mockResolvedValue(fakeAccessToken);

      const expected = {
        ...fakeUser,
        accessToken: fakeAccessToken,
      };

      // Act
      const result = await AuthService.doLogin(requestBody);

      // Assert
      expect(result).toEqual(expected);
    });
  });
});

我也尝试了以下答案,但都没有用:

Sequelize Model Mocking findAll 和 findOne 使用 sequelize-mock 和 jest

用 Jest 和 sequelize-mock 模拟续集

回答如下:

vitest
没有给我正确的错误。在
vi.mock()
内部,我们无法访问外部范围的变量。

当我把它改成

jest
时,我得到了这个错误。现在,我已经将我的测试运行程序从
vitest
更改为
jest
,并且它正在运行。我还删除了
sequelize-mock
依赖项,因为到目前为止我的用例不需要它。

const bcrypt = require('bcryptjs');

const { faker } = require('@faker-js/faker');

const AuthService = require('../../../src/modules/auth/auth.service');
const JwtService = require('../../../src/modules/auth/jwt.service');

jest.mock('../../../src/db/models/User', () => {
  const fakeUser = {
    id: 'fake-id',
    role: 'fake-role'
  };
  const User = {
   findOne: jest.fn().mockResolvedValue(fakeUser)
  };
  return User;
});

describe('AuthService', () => {
  describe('login', () => {
    it('should login user and return token', async () => {
      // Arrange
      const requestBody = {
        phone: faker.phone.phoneNumber('##########'),
        password: faker.internet.password(8),
      };
      const resolvedFakeUser = {
        userId: 'fake-id',
        role: 'fake-role',
      };
      const fakeAccessToken = 'fake-access-token';
      jest.spyOn(bcrypt, 'compareSync').mockImplementation(() => true);
      jest.spyOn(JwtService, 'generateJWT').mockResolvedValue(fakeAccessToken);

      const expected = {
        ...fakeUser,
        accessToken: fakeAccessToken,
      };

      // Act
      const result = await AuthService.doLogin(requestBody);

      // Assert
      expect(result).toEqual(expected);
    });
  });
});
发布评论

评论列表(0)

  1. 暂无评论