使用 Supertest 测试 express 应用程序时存根第三方库的构造函数
Stubbing a constructor of a third party library when testing express app with Supertest
我有一个简单的 Express 应用程序,如下所示:
var SendMandrillTemplate = require('send-mandrill-template');
var sendMandrillTemplate = new SendMandrillTemplate('api-key-goes-here');
var app = require('express')();
app.get('/', function(req, res, next) {
sendMandrillTemplate.sendTemplate(
'template-name-goes-here',
'email@here.com', {
value: 123
},
function(err) {
if (err) {
res.send('ERR - ', err)
} else
res.send('DONE')
});
});
module.exports = app;
我导出应用程序对象,所以我可以像这样将其安装在单独的 server.js
-
var app = require('./app')
app.listen(1234, function() {
console.log('Running on port 1234');
});
这是为了让我更容易使用 supertest。
到目前为止,这是我的测试:
var app = require('./app')
var request = require('supertest')
var SendMandrillTemplate = require('send-mandrill-template');
describe('GET /', function() {
var sendTemplateStub;
before(function() {
//I think i need to setup a spy on the created instance of SendMandrillTemplate.sendTemplate
//sendTemplateStub = //?
});
it('calls sendTemplate on sendMandrillTemplate instance', function(done) {
request(app)
.get('/')
.expect(200)
.end(function(err, res) {
if (err) throw err;
//assert sendTemplateStub was called with 'template-name-goes-here'
//etc...
done();
})
})
})
如您所见,我在存根 SendMandrillTemplate 构造函数时遇到问题
如果我没有更新 SendMandrillTemplate
的实例,我可以这样做:
sendTemplateStub = sinon.stub(SendMandrillTemplate, 'sendTemplate')
但是,当然,在这种情况下,这是行不通的...
您可以通过
这样简单的事情逃脱惩罚
var SendMandrillTemplate = require('send-mandrill-template');
sinon.stub(SendMandrillTemplate.prototype, 'sendTemplate');
我有一个简单的 Express 应用程序,如下所示:
var SendMandrillTemplate = require('send-mandrill-template');
var sendMandrillTemplate = new SendMandrillTemplate('api-key-goes-here');
var app = require('express')();
app.get('/', function(req, res, next) {
sendMandrillTemplate.sendTemplate(
'template-name-goes-here',
'email@here.com', {
value: 123
},
function(err) {
if (err) {
res.send('ERR - ', err)
} else
res.send('DONE')
});
});
module.exports = app;
我导出应用程序对象,所以我可以像这样将其安装在单独的 server.js
-
var app = require('./app')
app.listen(1234, function() {
console.log('Running on port 1234');
});
这是为了让我更容易使用 supertest。
到目前为止,这是我的测试:
var app = require('./app')
var request = require('supertest')
var SendMandrillTemplate = require('send-mandrill-template');
describe('GET /', function() {
var sendTemplateStub;
before(function() {
//I think i need to setup a spy on the created instance of SendMandrillTemplate.sendTemplate
//sendTemplateStub = //?
});
it('calls sendTemplate on sendMandrillTemplate instance', function(done) {
request(app)
.get('/')
.expect(200)
.end(function(err, res) {
if (err) throw err;
//assert sendTemplateStub was called with 'template-name-goes-here'
//etc...
done();
})
})
})
如您所见,我在存根 SendMandrillTemplate 构造函数时遇到问题
如果我没有更新 SendMandrillTemplate
的实例,我可以这样做:
sendTemplateStub = sinon.stub(SendMandrillTemplate, 'sendTemplate')
但是,当然,在这种情况下,这是行不通的...
您可以通过
这样简单的事情逃脱惩罚var SendMandrillTemplate = require('send-mandrill-template');
sinon.stub(SendMandrillTemplate.prototype, 'sendTemplate');