首页 > 解决方案 > 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(),
}));

但我不确定这是正确的方法。

标签: javascriptunit-testingjestjs

解决方案


您可以在测试中使用requireActual来执行一个测试的原始行为。

这边走 :

jest.mock('./../_validation/report', () => ({
  validate: jest.requireActual('./../_validation/report').validate,
}));

这样,真正的validate 将被调用。当然,在下一次测试时(或在 beforeEach 中),您可以重新模拟您的函数。


推荐阅读