javascript - 如何在我的 javascript Web 应用程序的数据库层中为类函数编写单元测试?
问题描述
我正在使用 jest 为我的 Express 应用程序编写单元测试。我是新的测试和使用 jest,所以我很难为代表我的应用程序的数据库层的类函数编写单元测试。当我运行测试时,程序尝试调用数据库,但无法这样做,落到了 catch 块。我哪里做错了?谢谢你。
// 摘要.ts
import db from '../db/index';
import { generateError } from '../lib/generateError';
const SummaryModel = class {
static async findAll() {
const text = `SELECT * FROM public.summary`;
let result : any = {};
try {
result = await db.query(text);
} catch(e) {
if (e) {
throw generateError(500, 'could not query db');
}
}
const summaries = {
record: result.rows,
count: result.rowCount
}
return summaries;
}
}
export default SummaryModel;
// 摘要.test.js
const SummaryModel = require('../../../src/models/summary');
jest.mock('../../../src/models/summary');
test('should return an object with an array and number', async done => {
const summaries = await SummaryModel.default.findAll();
expect(typeof summaries.record).toBe('array');
expect(typeof summaries.count).toBe('number');
done();
});
// summary.test.js 已更新
const SummaryModel = require('../../../src/models/summary');
jest.mock('../../../src/models/summary');
test('should return an object with an array and number', async done => {
const SummaryModel = {
default: {
findAll: jest.fn()
},
}
const resp = {
record: [{},{}],
count: 2,
}
SummaryModel.default.findAll.mockResolvedValue(resp);
const summaries = await SummaryModel.default.findAll();
expect(summaries.record.length).toBe(2);
expect(summaries.count).toBe(2);
expect(typeof summaries.record).toBe('object');
expect(typeof summaries.count).toBe('number');
done();
});
解决方案
这个想法是模拟通常由您的方法返回的值。为此,您可以使用该函数mockResolvedValue
绕过对数据库的调用,并在每次findAll
调用时返回您想要的测试数据。例如,你可以有类似的东西:
SummaryModel.default.findAll.mockResolvedValue({
record: [{}, {}], // return some test data here
count: 2,
}
查看 Jest文档以了解如何模拟模块。
推荐阅读
- networking - 如何在无向图中找到一次通过每个节点的所有可能路径
- .htaccess - 机器人更好地找到进行重定向的html页面还是我应该只使用htaccess?
- stripe-payments - 从 Stripe web hook .Net 中提取元数据
- javascript - Apache 反向代理到节点 - 连接被拒绝:AH00957
- javascript - Vue.js 在初始加载时为 json 获取 null
- c# - 如何获取自定义 PropertyGrid 属性以显示密码屏蔽
- ios - 使用 AVAssetWriter 和 CoreML 的相机上的 FPS 不一致
- python - 为什么我的 readline() 没有附加到我的列表中?
- linux - 使用 Docker 命令检索 Pyspark 演示的 Jupyter 令牌时权限被拒绝
- javascript - 从 Node Js 项目的应用程序收到的不完整响应