gpt4 book ai didi

javascript - 单元测试 express.js 路由

转载 作者:行者123 更新时间:2023-12-03 07:06:18 25 4
gpt4 key购买 nike

我是新的表达和单元测试的新手。考虑以下代码:

var express = require('express');
var router = express.Router();

var bookingsController = require ("../controllers/bookings");

router
.route('/')
.get(bookingsController.bookings_get)
.post(bookingsController.bookings_post)


router
.route('/:id')
.get(bookingsController.bookings_get_id)
.put(bookingsController.bookings_put_id)
.delete(bookingsController.bookings_delete_id)

module.exports = router;

为此编写单元测试的正确/推荐方式是什么?例如,我希望能够测试 router.route('/:id')不接受 POST 调用。

我知道我可以使用 supertest 做到这一点,但我相信这将被视为集成测试,因为 supertest 将启动应用程序并运行测试。

我已经阅读并尝试了多个 node.js/express.js 测试教程,但找不到答案。任何指向现有教程的指针都非常受欢迎。在这里直接回答,甚至更多:)

最佳答案

这是使用 sinon.js 的单元测试解决方案 stub express.Router功能并做出断言。
router.js :

var express = require('express');
var router = express.Router();

var bookingsController = require('./controllers/bookings');

router
.route('/')
.get(bookingsController.bookings_get)
.post(bookingsController.bookings_post);

router
.route('/:id')
.get(bookingsController.bookings_get_id)
.put(bookingsController.bookings_put_id)
.delete(bookingsController.bookings_delete_id);

module.exports = router;
./controller/bookings.js :

module.exports = {
bookings_get() {},
bookings_post() {},
bookings_get_id() {},
bookings_put_id() {},
bookings_delete_id() {},
};
router.test.js :

var sinon = require('sinon');
var express = require('express');

describe('61529619', () => {
it('should pass', () => {
const routerStub = {
route: sinon.stub().returnsThis(),
post: sinon.stub().returnsThis(),
get: sinon.stub().returnsThis(),
put: sinon.stub().returnsThis(),
delete: sinon.stub().returnsThis(),
};
sinon.stub(express, 'Router').callsFake(() => routerStub);
require('./router');
sinon.assert.calledWith(routerStub.route, '/');
sinon.assert.calledWith(routerStub.route, '/:id');
sinon.assert.calledWith(routerStub.get, sinon.match.func);
sinon.assert.calledWith(routerStub.post, sinon.match.func);
sinon.assert.calledWith(routerStub.put, sinon.match.func);
sinon.assert.calledWith(routerStub.delete, sinon.match.func);
});
});

覆盖率 100% 的单元测试结果:

  61529619
✓ should pass (869ms)


1 passing (881ms)

----------------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------------------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 0 | 100 |
61529619 | 100 | 100 | 100 | 100 |
router.js | 100 | 100 | 100 | 100 |
61529619/controllers | 100 | 100 | 0 | 100 |
bookings.js | 100 | 100 | 0 | 100 |
----------------------|---------|----------|---------|---------|------------------

关于javascript - 单元测试 express.js 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61529619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com