模型时,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);
});
});
});
更多推荐
TypeError:在 vitest 中模拟 sequelize 模型时,User.findOne 不是一个函数
发布评论