使用 Sinon 进行单元测试:如何在回调中测试变量?
Posted
技术标签:
【中文标题】使用 Sinon 进行单元测试:如何在回调中测试变量?【英文标题】:Unit Testing w/ Sinon: How do I test a variable inside of a Callback? 【发布时间】:2019-05-05 10:16:17 【问题描述】:我正在与 Sinon 进行单元测试,以至少尝试让某些东西通过,但我不走运。我在网上找不到任何东西。
我有两个问题:
1) 我试图得到一个简单的响应,但它说spy
是false
失败。当我记录它时,它说它是true
。
2) 我想在回调函数中测试模板是否等于'New Title'。我无法弄清楚如何将 req、res 和 next 传递到 router.get
router.js
const express = require('express'), router = express.Router();
router.get('/', (req, res, next) =>
var template =
title: req.title,
item: req.item,
description: 'N/A'
;
res.render('index', template);
module.exports = router;
);
router.spec.js
const router = require('./router');
var res = ;
var req =
title: 'New Title',
item: 'Blank Item'
;
var template =
title: req.title,
item: req.item,
description: 'N/A'
;
it('1) should call the response', ()=>
var spy = sinon.spy(route, 'get');
route.get('/', ()=>);
console.log(spy.calledOnce); // equals true
assert(spy.calledOnce).toBeTruthy();
spy.restore();
);
it('2) should return a status 200', ()=>
var stub = sinon.stub().yield([req, res, next]);
route.get('/', stub); // main problem
assert.equal(200, res.statusCode);
stub.restore();
);
我想访问路由处理程序,以便进行进一步的测试。在这种情况下,我可以在哪里以及如何实现路由处理?
【问题讨论】:
你应该阅读API Testing。这超出了单元测试的范围。您需要按照@deerawan 的建议编写适当的集成测试 【参考方案1】:用于路由的 Express 应用程序通常最好使用集成测试而不是您尝试进行的单元测试进行测试。 Supertest 可以用作库。
我们可以做的另一个改进是将生成模板的逻辑分离到另一个文件中。而对于这个服务,我们可以对其进行单元测试。可以选择使用mocha 或jest。
例子:
const request = require('supertest');
const express = require('express');
const service = require('./service'); // our new service file
const app = express();
app.get('/', function(req, res)
const template = service.getTemplate(req);
res.render('index', template);
);
// integration test, ideally must be separated into a test file e.g. app-integration-test.js
request(app)
.get('/')
.expect('Content-Type', /json/)
.expect('Content-Length', '15')
.expect(200)
.end(function(err, res)
if (err) throw err;
);
// service.js
function getTemplate(req, res)
return
title: req.title,
item: req.item,
description: 'N/A'
;
// service-unit-test.js
describe('service test', function()
it('returns template correctly', function()
const req =
title: 'someone',
item: 'my item',
const template = service.getTemplate(req);
expect(template).to.eql(
title: 'someone',
item: 'my item',
description: 'N/A'
)
)
)
希望对你有帮助!
【讨论】:
以上是关于使用 Sinon 进行单元测试:如何在回调中测试变量?的主要内容,如果未能解决你的问题,请参考以下文章
使用javascript与Mocha和Sinon进行单元测试问题
单元/集成测试 Express REST API, mongoose, mocha, sinon, chai, supertest