Javascript 单元测试w/Sinon:如何在回调中测试变量?
我和Sinon一起做了一个单元测试,至少试着让一些东西通过,但我运气不好。我在网上找不到任何东西 我有两个问题: 我试图得到一个简单的回答,但它没有说间谍是假的。当我记录它时,它说这是真的 2我想测试回调函数中的模板是否等于“New Title”。我不知道如何将req、res和next传递到router.get 路由器.js router.spec.jsJavascript 单元测试w/Sinon:如何在回调中测试变量?,javascript,unit-testing,mocha.js,sinon,Javascript,Unit Testing,Mocha.js,Sinon,我和Sinon一起做了一个单元测试,至少试着让一些东西通过,但我运气不好。我在网上找不到任何东西 我有两个问题: 我试图得到一个简单的回答,但它没有说间谍是假的。当我记录它时,它说这是真的 2我想测试回调函数中的模板是否等于“New Title”。我不知道如何将req、res和next传递到router.get 路由器.js router.spec.js 我想访问路由处理程序,以便进行进一步测试。在这种情况下,在何处以及如何实现路由处理?用于路由的Express app通常最好使用集成测试进行测
我想访问路由处理程序,以便进行进一步测试。在这种情况下,在何处以及如何实现路由处理?用于路由的Express app通常最好使用集成测试进行测试,而不是您尝试进行的单元测试。可作为图书馆使用 我们可以做的另一个改进是将生成模板的逻辑分离到另一个文件中。对于这个服务,我们可以对它进行单元测试。使用或可以是选项 例如:
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'
})
})
})
希望有帮助 你应该读书。这超出了单元测试的范围。您需要按照@deerawan的建议编写适当的集成测试
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();
});
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'
})
})
})