javascript - 用 Jest 和 sequelize-mock 模拟 sequelize
问题描述
我正在构建一个新项目,我正在尝试使用 TDD 作为我的默认方法,并尝试将它与集成测试一起应用。
事情很简单,我想从我的数据库中检索所有用户。
//controller.js
const UserService = require('../services/user');
module.exports = {
// corresponds to /users
getAllUsers: async (req, res, next) => {
const users = await UserService.fetchAllUsers();
res.send(users);
},
};
const models = require('../database/models/index'); // I tried also with destructuring
module.exports = {
fetchAllUsers: async () => models.user.findAll(),
};
我的实际测试文件看起来像
const request = require('supertest');
const SequelizeMock = require('sequelize-mock');
const app = require('..');
const dbMock = new SequelizeMock();
const models = require('../src/database/models/index');
jest.mock('../src/database/models/index', () => ({
user: jest.fn(),
}));
models.user.mockImplementation(() => {
const UserMock = dbMock.define('user', {});
UserMock.$queueResult(UserMock.build({
username: 'username',
mail: 'myMail@myMail.com',
}));
return UserMock;
});
describe('Demo test', () => {
it('should respond to users route', (done) => {
request(app)
.get('/users')
.end((err, res) => {
expect(err).toBeNull();
expect(res.status).toBe(200);
expect(res.json).toBe('object');
done();
});
});
});
所有这些实际上都是有效的,但是当我试图模拟用户时,我 TypeError: models.user.findAll is not a function
我需要用 UserMock 的值替换 model.user。
有没有办法做到这一点?或者我应该像这样模拟 findAll
jest.mock('../src/database/models/index', () => ({
user: () => ({ findAll: jest.fn() }),
}));
``
解决方案
在这种情况下,我并不是在嘲笑我想要的。
如果您想模拟模型,您需要做的就是SpyOn
使用
const { sequelize, Report, User } = require('../../database/models/index');
describe("my test", () => {
it("should just mock", () => {
jest.SpyOn(Report, "count").mockResolvedOnce(6);
})
})
如果您需要模拟您的服务
首先创建 jest 函数以允许从您的模拟范围之外进行访问,然后使用“双重类调用”模拟它
const BaseService = require('../BaseService');
const mockFecthOne = jest.fn();
jest.mock('../BaseService',
() => jest.fn().mockImplementation(
() => ({
fetchOne: mockFetchOne,
}),
));
// inside your test just
BaseService().fetchOne.mockResolvedOnce({....})
这就是它希望它的工作原理。
推荐阅读
- javascript - 如何在 Chrome Mobile 中从全屏模式返回
- python - 如何通过传递用户名和密码登录共享点?
- android - 什么是 Zygote 写时复制堆?
- c# - Entity Framework Core 的 MySQL 排序规则问题
- django - 我正在执行构建 django2 Web 应用程序的代码。将 sqlite db 更改为 postgresql 后,我收到此错误。如何摆脱这个错误?
- json - twig:只显示 JSON 数组中的一个图像,该数组包含许多具有相同键名的不同大小的图像集?
- asp.net - Asp.Net 站点启动时如何强制“更新数据库”
- jakarta-ee - 不接受您的登录证书,或者可能没有提供
- python - Python 3 将 ping 设置为变量返回 0
- python - 删除行的一部分并在熊猫中向上移动数据框