node.js - 为 NodeJs 控制器编写 Mocha Chai 测试用例
问题描述
我是单元测试的新手。我正在尝试为 nodejs 微服务文件的 controller.js 文件编写测试用例。我无法理解我哪里出错了。对于这些属性中的 2 个,始终会引发错误“TypeError:无法读取未定义的属性 'empId'”。
这是控制器代码:
const crmgDetails = db.crmgResource_details;
const employeeProposal = db.employee_Proposal;
const Op = db.Sequelize.Op;
const raDetails = db.crmgRaSheet_entity;
let results = [];
Sequelize = require('sequelize')
exports.findOne = (req, res) => {
console.log(req.body.empId);
crmgDetails.findAll({where: {
resEmployeeNumber: req.body.empId
}
})
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving tutorials."
});
});
};
exports.findMatchingDemandsForRmg = (req,res) => {
let proposedDemands = [];
employeeProposal.findAll({
where: {
emp_id: req.body.empId,
demandSbu : req.body.sbu
}
}).then(proposedEmployee => {
console.log('proposedEmployee',proposedEmployee);
if(proposedEmployee.length === 0){
crmgDetails.findAll({
where: {
resEmployeeNumber: req.body.empId,
demandSbu: req.body.sbu
}
}).then(matchingDemands => {
console.log('matchingDemands ',matchingDemands)
proposedDemands = matchingDemands;
})
}
else{
console.log("crmg Employee")
console.log(proposedEmployee)
for(let employee of proposedEmployee){
crmgDetails.findOne({
where: {
demandUid: employee.demandUid,
resEmployeeNumber: req.body.empId,
demandSbu: req.body.sbu
}
}).then( crmgProposed=> {
proposedDemands.push(crmgProposed);
})
}
}
setTimeout(() => {
console.log(proposedDemands)
res.send(proposedDemands);
}, 3000);
}).catch((err)=>{
res.status(500).send({
message:
err.message || "Some error occurred while retrieving tutorials."
});
})
}
exports.getResourceAllocationDetails = (req,res) => {
employeeProposal.findAll({
include: {
model: raDetails
},
where: Sequelize.and(
{activeFlag : true},
Sequelize.or({status:"Accepted By RMG"},
{status:"Rejected"}
))
}).then(employees => {
res.send(employees)
})
}
这是我试图在没有头脑的情况下编写的测试文件:
const CrmgRaSheetModel = require('../controllers/crmgResource_Details.controller')
describe('Check for succcessful fetech API call', () => {
it('property getResourceAllocationDetails should be called', async () => {
CrmgRaSheetModel.getResourceAllocationDetails((res) => {
expect(res).to.be.an('object')
return res.json()
})
});
it('property findMatchingDemandsForRmg should be called', async () => {
CrmgRaSheetModel.findMatchingDemandsForRmg((res) => {
expect(res).to.be.an('object')
return res.json()
})
});
it('property findOne should be called', async () => {
CrmgRaSheetModel.findOne((res) => {
expect(res).to.be.an('object')
return res.json()
})
})
})
解决方案
从测试文件中,您仅使用 res 调用控制器方法,因此没有机会将您的输入作为您的身体发送。所以通过 req,res 并在 req 中传递你的输入值
推荐阅读
- mysql - 我可以在 mysql 最新版本中设置截断表查询的条件吗?
- doc2vec - Sent2Vec 或 Doc2Vec 测试
- pentaho - Pentaho 的 CDE 仪表板的表组件中的 Cretae 新列,表示 2 列的总和
- python - 如果根据数据帧的行和列值满足特定条件,如何获取列标题?
- c# - 下拉列表未选择正确的值
- html - 通过 VBScript 从 IE 表中获取元素
- c# - 上一个按钮不适用于 DataGridView C#
- bash - 为什么带有“and”运算符(“&&”)的链式命令不会在启用“errexit”的非零结果上停止?
- sapui5 - SAPUI5 Fiori 智能表和同一页面中的其他控件
- intellij-idea - 在 IntelliJ 中编写 IBM Domino 应用程序