Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在这种情况下使用Jest测试Express router catch分支?_Javascript_Node.js_Express_Jestjs_Supertest - Fatal编程技术网

Javascript 如何在这种情况下使用Jest测试Express router catch分支?

Javascript 如何在这种情况下使用Jest测试Express router catch分支?,javascript,node.js,express,jestjs,supertest,Javascript,Node.js,Express,Jestjs,Supertest,我有一个有两条路线的文件 routes/index.js const express = require('express') const router = express.Router() router.get('', (req, res, next) => { try { res.status(200).render('../views/') } catch (error) { next(error) } }) router.get('*', (req,

我有一个有两条路线的文件

routes/index.js

const express = require('express')
const router = express.Router()

router.get('', (req, res, next) => {
  try {
    res.status(200).render('../views/')
  } catch (error) {
    next(error)
  }
})

router.get('*', (req, res, next) => {
  try {
    res.status(404).render('../views/not-found')
  } catch (error) {
    next(error)
  }  
})

module.exports = router
我想测试一下钓鱼的树枝。一个明显的问题是,我不能伪造router.get的回调函数,因为这样我的测试就没有意义了,我会修改我想要测试的东西

我可以向这些特定的路由发送Supertest请求,但是我无法控制会发生什么。我希望避免创建硬编码路由,只是为了检查中间件是否被下一个函数调用。如果我理解正确,如果我在try块中发生了额外的事情(比如数据库查询),那么我可以模拟它来抛出错误

但我没有任何额外的事情发生在那里。以下是我无法理解的:如果我嘲笑服务器所做的事情,那么我不会测试我已经拥有的东西,而是其他东西,所以这样做没有意义。也许我误解了事情的工作原理,但就我所知,唯一的选择是以某种方式模拟res.status或res.render所做的事情(存根它们以便它们抛出错误),以某种方式模拟Supertest所做的事情,但我不知道如何做

任何帮助都将不胜感激

单元测试解决方案:

route.js

const express=require('express');
const router=express.router();
路由器.get(“”,(请求、恢复、下一步)=>{
试一试{
res.status(200).render(“../views/”);
}捕获(错误){
下一步(错误);
}
});
路由器.get(“*”,(请求、恢复、下一步)=>{
试一试{
res.status(404).render(“../views/notfound”);
}捕获(错误){
下一步(错误);
}
});
module.exports=路由器;
route.test.js

description('64051580',()=>{
之后(()=>{
jest.reset模块();
开玩笑。恢复记忆();
});
它('应该呈现视图',()=>{
const express=require('express');
constmrouter={get:jest.fn()};
jest.spyOn(express,'Router').mockImplementationOnce(()=>mRouter);
常量mReq={};
const mRes={status:jest.fn().mockReturnThis(),render:jest.fn()};
const mNext=jest.fn();
mRouter.get.mockImplementation((路径,回调)=>{
如果(路径==''){
回调(mReq、mRes、mNext);
}
});
要求(“/路线”);
预期(mRes.状态)。与(200)一起调用;
期望(mRes.render).toBeCalledWith(“../views/”);
});
它('应该处理错误',()=>{
const express=require('express');
constmrouter={get:jest.fn()};
jest.spyOn(express,'Router').mockImplementationOnce(()=>mRouter);
常量mReq={};
const mErr=新错误('parse');
常数mRes={
状态:jest.fn().mockReturnThis(),
render:jest.fn().mockImplementationOnce(()=>{
掷骰子;
}),
};
const mNext=jest.fn();
mRouter.get.mockImplementation((路径,回调)=>{
如果(路径==''){
回调(mReq、mRes、mNext);
}
});
要求(“/路线”);
expect(mNext).toBeCalledWith(mErr);
});
它('应该呈现404未找到视图',()=>{
const express=require('express');
constmrouter={get:jest.fn()};
jest.spyOn(express,'Router').mockImplementationOnce(()=>mRouter);
常量mReq={};
const mRes={status:jest.fn().mockReturnThis(),render:jest.fn()};
const mNext=jest.fn();
mRouter.get.mockImplementation((路径,回调)=>{
如果(路径=='*'){
回调(mReq、mRes、mNext);
}
});
要求(“/路线”);
期望(mRes.status)与(404)一起调用;
expect(mRes.render).toBeCalledWith(“../views/notfound”);
});
});
单元测试结果和覆盖率报告:

PASS src/stackoverflow/64051580/route.test.js
64051580
✓ 应渲染视图(656ms)
✓ 应处理错误(17ms)
✓ 应渲染404找不到视图(16ms)
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 90.91 | 100 | 100 | 90.91 ||
route.js | 90.91 | 100 | 100 | 90.91 | 16|
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:3次通过,共3次
快照:共0个
时间:4.28秒,估计10秒
单元测试解决方案:

route.js

const express=require('express');
const router=express.router();
路由器.get(“”,(请求、恢复、下一步)=>{
试一试{
res.status(200).render(“../views/”);
}捕获(错误){
下一步(错误);
}
});
路由器.get(“*”,(请求、恢复、下一步)=>{
试一试{
res.status(404).render(“../views/notfound”);
}捕获(错误){
下一步(错误);
}
});
module.exports=路由器;
route.test.js

description('64051580',()=>{
之后(()=>{
jest.reset模块();
开玩笑。恢复记忆();
});
它('应该呈现视图',()=>{
const express=require('express');
constmrouter={get:jest.fn()};
jest.spyOn(express,'Router').mockImplementationOnce(()=>mRouter);
常量mReq={};
const mRes={status:jest.fn().mockReturnThis(),render:jest.fn()};
const mNext=jest.fn();
mRouter.get.mockImplementation((路径,回调)=>{
如果(路径==''){
回调(mReq、mRes、mNext);
}
});
要求(“/路线”);
预期(mRes.状态)。与(200)一起调用;
期望(mRes.render).toBeCalledWith(“../views/”);
});
它('应该处理错误',()=>{
const express=require('express');
constmrouter={get:jest.fn()};
jest.spyOn(express,'Router').mockImplementationOnce(()=>mRouter);
常量mReq={};
const mErr=新错误('parse');
常数mRes={
状态:jest.fn().mockReturnThis(),
render:jest.fn().mockImplementationOnce(