我正在与Sinon进行单元测试,至少要设法使某些东西通过并且运气不佳。我无法在网上找到任何东西。
我有2个问题:
1)我试图得到一个简单的答复,但未能说明spy
是false
。当我登录时,它说是true
。
2)我要测试回调函数中的模板是否等于“ New Title”。我无法弄清楚如何将req,res和next传递到router.get
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;
});
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();
});
我想访问路由处理程序,以便进行进一步的测试。在这种情况下,在哪里以及如何实施路由处理?
答案 0 :(得分: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'
})
})
})
希望有帮助!