Javascript Jest-调用模拟函数不计算在内

Javascript Jest-调用模拟函数不计算在内,javascript,unit-testing,jestjs,Javascript,Unit Testing,Jestjs,我对调用计数next函数感到困惑。我正在使用强大的来处理表单 这是我的密码: const ctrl = {}; ctrl.addAccount = async (req, res, next) => { const form = new formidable.IncomingForm(); form.multiples = true; form.parse(req, async function (err, fields, files) { const accou

我对调用计数
next
函数感到困惑。我正在使用强大的来处理表单

这是我的密码:

const ctrl = {};
ctrl.addAccount = async (req, res, next) => {
  const form = new formidable.IncomingForm();

  form.multiples = true;

  form.parse(req, async function (err, fields, files) {

    const accountType = _.get(fields, 'accountType');


    if (accountTypes.indexOf(accountType) === -1) {
      // next is mocked, call counted in different test
      next(boom.badRequest('Account type is not supported'));
      return;
    }

    try {
      // some logic
      await validator.validate(fields);

      // Some logic
      res.status(200).send("OK");

    } catch (err) {
      next(boom.badRequest(err)); // next is mocked but call didn't count
    }
  });
};

module.exports = ctrl;
以下是测试:

it.only('return Error on validation error', async () => {
  const fields = {
    accountType: "moderator",
    title: "Title"
  };
  const files = {};

  const formidableFn = {
    IncomingForm: jest.fn(),
    parse: jest.fn((req, callback) => callback(undefined, fields, files)),
    multiples: true
  };
  const formidable = require('formidable');
  formidable.mockImplementation(() => formidableFn);

  const { addAccount } = require('./add');

  const mReq = {
    body: {},
    dbConnection: jest.fn()
  };

  const mRes = {
    send: jest.fn().mockReturnThis()
  };

  const mNext = jest.fn().mockName('next function');

  await addAccount(mReq, mRes, mNext);

  expect(formidableFn.parse).toHaveBeenCalledTimes(1);
  expect(formidableFn.parse).toHaveBeenCalledWith(mReq, expect.any(Function));

  expect(mNext).toHaveBeenCalledTimes(1); // I've got 0 instead of 1
});
我希望能
mNext
打一次电话。但我得到了0。我已经通过catch语句中的
console.log(next)
进行了检查,我可以看到
next
函数是mock函数

在不同的测试中,我接下来测试
(boom.badRequest(“不支持帐户类型”);

已计数。

以下是单元测试解决方案:

例如

add.js

const nervouse=require('nervouse');
const=require('lodash');
const validator=require(“./validator”);
const accountTypes=['主持人'];
恒臂={
错误请求:(err)=>错误,
};
常量ctrl={};
ctrl.addAccount=async(请求、恢复、下一步)=>{
const form=new.IncomingForm();
form.multiples=真;
parse(req,异步函数(err,字段,文件){
const accountType=u.get(字段“accountType”);
if(accountTypes.indexOf(accountType)=-1){
下一步(boom.badRequest('不支持帐户类型');
回来
}
试一试{
等待验证器。验证(字段);
res.status(200)。发送('OK');
}捕捉(错误){
下一步(boom.badRequest(err));
}
});
};
module.exports=ctrl;
validator.js

const验证程序={
验证:异步(字段)=>{
log('validate fields');
},
};
module.exports=验证程序;
add.test.js

const nervouse=require('nervouse');
const{addAccount}=require('./add');
const validator=require(“./validator”);
笑话.嘲弄(‘可怕’,()=>{
常数mForm={
倍数:假,
parse:jest.fn(),
};
返回{
IncomingForm:jest.fn(()=>mForm),
};
});
描述('59459690',()=>{
之后(()=>{
jest.resetAllMocks();
开玩笑。恢复记忆();
});
它('验证错误时返回错误',异步()=>{
常量字段={
accountType:'主持人',
标题:“标题”,
};
常量文件={};
const form=new.IncomingForm();
让最初的回忆回来;
form.parse.mockImplementation((req,callback)=>{
originalCallback=回调;
});
const mError=新错误(“验证错误”);
jest.spyOn(验证器,'validate').mockRejectedValueOnce(mError);
常数mReq={
正文:{},
dbConnection:jest.fn(),
};
常数mRes={
send:jest.fn().mockReturnThis(),
};
const mNext=jest.fn().mockName('next function');
等待添加帐户(mReq、mRes、mNext);
等待原始回调(未定义、字段、文件);
expect(form.parse).toHaveBeenCalledTimes(1);
expect(form.parse).toHaveBeenCalledWith(mReq,expect.any(函数));
期望(mNext).已被催收时间(1);
});
});
单元测试结果和覆盖率报告:

PASS src/stackoverflow/59459690/add.test.js
59459690
✓ 验证错误时返回错误(8ms)
--------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
--------------|----------|----------|----------|----------|-------------------|
所有文件| 79.17 | 50 | 66.67 | 78.26 ||
add.js | 85 | 50 | 100 | 84.21 | 20,21,25|
validator.js | 50 | 100 | 0 | 50 | 2,3|
--------------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:3.82秒,估计8秒

源代码:

谢谢您的回答和详细解释。