Node.js 在restapi节点中开玩笑&x27;无法为Controller.js找到正确的测试

Node.js 在restapi节点中开玩笑&x27;无法为Controller.js找到正确的测试,node.js,json,rest,unit-testing,jestjs,Node.js,Json,Rest,Unit Testing,Jestjs,我为物流控制创建了一个RESTAPI,可以创建一个卡车司机,根据司机是否装载、日期等过滤搜索具体的司机 现在,为了完成我的项目,我正在尝试为此导出模块创建一个单元测试,但a无法找到正确的解决方案: const Driver = require('../models/models.js'); // Create and Save a new driver exports.create = (req, res) => { const { oLongitude, oLatitude }

我为物流控制创建了一个RESTAPI,可以创建一个卡车司机,根据司机是否装载、日期等过滤搜索具体的司机

现在,为了完成我的项目,我正在尝试为此导出模块创建一个单元测试,但a无法找到正确的解决方案:

const Driver = require('../models/models.js');

// Create and Save a new driver
exports.create = (req, res) => {

  const { oLongitude, oLatitude } = req.body;
  const { dLongitude, dLatitude } = req.body;

  // Validade request
  if (!Object.keys(req.body).length) {
    return res.status(400).json({
      message: "Form content can not be empty"
    });
  }

  //Create a driver
  const driver = new Driver({
    name: req.body.name,
    age: req.body.age,
    gender: req.body.gender,
    veichle: req.body.veichle,
    cnhType: req.body.cnhType,
    loaded: req.body.loaded,
    truckType: req.body.truckType,
    origin: {
      type: 'Point',
      coordinates: [oLongitude, oLatitude]
    },
    destination: {
      type: 'Point',
      coordinates: [dLongitude, dLatitude]
    },
    date: req.body.date
  });

  //Save driver in the database
  driver.save()
    .then(data => {
      res.json(data);
    }).catch(err => {
      res.status(500).send({
        message: err.message || "Some error ocurred while creating the driver."
      });
    });
};
这是我已经尝试过的:

const httpMocks = require('node-mocks-http');
const { create } = require('../app/controllers/controller.js');

describe('create', () => {
  test('should create stuff', () => {
    const request = httpMocks.createRequest({
      method: 'POST',
      url: '/create'
    });

    const response = httpMocks.createResponse();

    create(request, response, (err) => {
      expect(err).toBeFalsy();
    });

    const { property } = JSON.parse(response._getData());

    expect(property).toBe({
      name: "Antonio dos Santos",
      age: "27",
      gender: "masculino",
      veichle: "nao",
      cnhType: "D",
      loaded: "nao",
      truckType: 2,
      oLongitude: -46.9213486,
      oLatitude: -23.7341936,
      dLongitude: -46.9057519,
      dLatitude: -23.8529033,
      date: "08/02/2020"
    });
  });
});

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

const Driver = require('../models/models.js');

// Create and Save a new driver
exports.create = (req, res) => {

  const { oLongitude, oLatitude } = req.body;
  const { dLongitude, dLatitude } = req.body;

  // Validade request
  if (!Object.keys(req.body).length) {
    return res.status(400).json({
      message: "Form content can not be empty"
    });
  }

  //Create a driver
  const driver = new Driver({
    name: req.body.name,
    age: req.body.age,
    gender: req.body.gender,
    veichle: req.body.veichle,
    cnhType: req.body.cnhType,
    loaded: req.body.loaded,
    truckType: req.body.truckType,
    origin: {
      type: 'Point',
      coordinates: [oLongitude, oLatitude]
    },
    destination: {
      type: 'Point',
      coordinates: [dLongitude, dLatitude]
    },
    date: req.body.date
  });

  //Save driver in the database
  driver.save()
    .then(data => {
      res.json(data);
    }).catch(err => {
      res.status(500).send({
        message: err.message || "Some error ocurred while creating the driver."
      });
    });
};
controller.js

const Driver=require('./models.js');
exports.create=(请求、回复)=>{
const{oLongitude,oLatitude}=req.body;
常数{dLongitude,dLatitude}=req.body;
if(!Object.keys(请求正文).length){
返回res.status(400).json({
消息:“表单内容不能为空”,
});
}
常量驱动程序=新驱动程序({
名称:req.body.name,
年龄:要求的身体年龄,
性别:req.body.gender,
veichle:req.body.veichle,
cnhType:req.body.cnhType,
已加载:请求主体已加载,
truckType:req.body.truckType,
来源:{
键入:“点”,
坐标:[oLongitude,oLatitude],
},
目的地:{
键入:“点”,
坐标:[纬度,纬度],
},
日期:req.body.date,
});
返回驱动器
.save()
。然后((数据)=>{
res.json(数据);
})
.catch((错误)=>{
资源状态(500)。发送({
message:err.message | |“创建驱动程序时出错。”,
});
});
};
models.js

函数驱动程序(){
异步函数save(){
返回“实际执行”;
}
返回{
拯救
};
}
module.exports=驱动程序;
controller.test.js

const{create}=require('./controller');
const Driver=require('./models.js');
jest.mock('./模型',()=>{
constmdriver={save:jest.fn()};
return jest.fn(()=>mDriver);
});
描述('60189651',()=>{
之后(()=>{
开玩笑。clearAllMocks();
});
它('应该创建驱动程序并发送到客户端',()=>{
期望.断言(3);
常数mReq={
正文:{
姓名:'姓名',
年龄:23,,
性别:'男性',
韦奇勒:“宝马”,
cnhType:'类型',
是的,
truckType:'truckType',
奥拉提多:1,
理由:1,
长度:2,
年龄:2,
日期:2020年,
},
};
const mRes={json:jest.fn()};
const mDriver=新驱动程序();
mDriver.save.mockResolvedValueOnce(“保存的驱动程序”);
返回创建(mReq,mRes)。然后(()=>{
期望(驱动程序)。使用({
姓名:'姓名',
年龄:23,,
性别:'男性',
韦奇勒:“宝马”,
cnhType:'类型',
是的,
truckType:'truckType',
来源:{
键入:“点”,
座标:[1,1],
},
目的地:{
键入:“点”,
座标:[2,2],
},
日期:2020年,
});
expect(mDriver.save).toBeCalledTimes(1);
expect(mRes.json).toBeCalledWith('saved driver');
});
});
它('如果请求正文为空,则应处理错误',()=>{
const mReq={body:{};
const mRes={status:jest.fn().mockReturnThis(),json:jest.fn()};
创建(mReq、mRes);
期望(mRes.状态)与(400)一起调用;
expect(mRes.status(400.json).toBeCalledWith({message:'表单内容不能为空'});
});
它('保存驱动程序失败时应处理错误',()=>{
期望.断言(4);
常数mReq={
正文:{
姓名:'姓名',
年龄:23,,
性别:'男性',
韦奇勒:“宝马”,
cnhType:'类型',
是的,
truckType:'truckType',
奥拉提多:1,
理由:1,
长度:2,
年龄:2,
日期:2020年,
},
};
const mRes={status:jest.fn().mockReturnThis(),send:jest.fn()};
const mDriver=新驱动程序();
const mError=新错误(“数据库连接失败”);
mDriver.save.mockRejectedValueOnce(mError);
返回创建(mReq,mRes)。然后(()=>{
期望(驱动程序)。使用({
姓名:'姓名',
年龄:23,,
性别:'男性',
韦奇勒:“宝马”,
cnhType:'类型',
是的,
truckType:'truckType',
来源:{
键入:“点”,
座标:[1,1],
},
目的地:{
键入:“点”,
座标:[2,2],
},
日期:2020年,
});
expect(mDriver.save).toBeCalledTimes(1);
期望(mRes.状态)与(500)一起调用;
expect(mRes.status(500.send).toBeCalledWith({message:mError.message});
});
});
});
单元测试结果和覆盖率报告:

PASS stackoverflow/60189651/controller.test.js(6.724s)
60189651
✓ 应创建驱动程序并发送到客户端(6ms)
✓ 如果请求正文为空(2ms),则应处理错误
✓ 如果保存驱动程序失败,应处理错误(1ms)
---------------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
---------------|---------|----------|---------|---------|-------------------
所有文件| 100 | 75 | 100 | 100 |
controller.js | 100 | 75 | 100 | 100 | 39
---------------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:3次通过,共3次
快照:共0个
时间:8.747秒,估计9秒

源代码:

我能看到的几件事情似乎不太正确-在测试中传递给
create
的回调处理程序永远不会被调用,也不会以这种方式工作。您似乎没有模仿
驱动程序
,这意味着这将试图在某些数据库中持久化?(大概这是猫鼬)。我倾向于检查从响应返回的状态代码