javascript - Jest mocks - 如何在测试之间恢复原始功能
问题描述
我有我的功能:
report.js
:
const ctrl = {};
const _ = require('lodash');
const boom = require("boom");
const slackNotifications = require('./../../slack/controllers/notifications');
const reportModel = require("./../models/report");
import validationSchema from "./../_validation/report";
ctrl.addReport = async (req, res) => {
const { body } = req;
try {
const validatedData = await validationSchema.validate(body);
const report = await reportModel(req.dbConnection).addReport(validatedData);
if (report.reported) {
await slackNotifications.notify('Notify me!');
res.status(200).send({ reported: true });
} else {
throw boom.serverUnavailable("Can't offer report");
}
} catch (err) {
throw boom.badRequest(err);
}
};
module.exports = ctrl;
验证模式是使用 yup.js 创建的模式。
这是测试
问题是throw Error when validation failed
测试。我有
TypeError:无法读取未定义的属性“输出”
从109线
const { output, output: { payload } } = err;
.
但我的预期值是validationSchema.validate
在我的函数的第 23 行抛出并捕获的错误。
当我只运行这个测试时,一切都很好。我的状态代码和消息有正确的错误。
如何validationSchema.validate
从此测试(第 84 行)恢复原始功能?
我试图通过以下方式恢复:
jest.mock('./../_validation/report', () => ({
// validate: jest.fn().mockReset(),
validate: jest.fn().mockClear(),
}));
但我不确定这是正确的方法。
解决方案
您可以在测试中使用requireActual来执行一个测试的原始行为。
这边走 :
jest.mock('./../_validation/report', () => ({
validate: jest.requireActual('./../_validation/report').validate,
}));
这样,真正的validate 将被调用。当然,在下一次测试时(或在 beforeEach 中),您可以重新模拟您的函数。
推荐阅读
- c# - 进度条的 Visibility 属性在运行时不变
- xslt - 是否可以使用 xslt2.0 或 xslt 3.0 将解析器错误消息存储在变量中
- ios - 如何在没有 UIDocumentPickerViewController 的情况下访问所有 iCloud 驱动器文件(应用程序容器外)?
- react-native - 如何使用 HERE-MAP 为 uber 等路线创建 react-native 应用程序?
- python - mktime 参数超出范围
- java - 如何将全局二级索引添加到 DynamoDB 中的现有表?
- python - 如何在发票对象中添加元数据?
- encryption - 可加密密码的最大长度
- angular - Jasmine Marbles:测试用于处理 HTTP 的自定义 RXJS 运算符
- c++ - 无法渲染到 GtkGLArea