开玩笑的嘲笑-如何在测试之间恢复原始功能

时间:2019-12-21 09:44:08

标签: javascript unit-testing jestjs

我有我的职能:

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创建的架构。

这里是tests

问题是throw Error when validation failed测试。我有

  

TypeError:无法读取未定义的属性“输出”

从109行

const { output, output: { payload } } = err;

但是我的期望值是validationSchema.validate抛出的错误,并陷入了函数的第23行。

当我仅运行此测试时,一切正常。我的状态代码和消息有正确的错误。

如何通过此测试(第84行)恢复原始功能validationSchema.validate

我尝试通过以下方式还原

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

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

1 个答案:

答案 0 :(得分:1)

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

这种方式:

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

这样,将调用真实验证 当然,在下一个测试中(或在beforeEach中),您可以重新模拟您的功能。