在使用Supertest测试express应用程序时,存根第三方库的构造函数

Stubbing a constructor of a third party library when testing express app with Supertest

本文关键字:存根 第三方 构造函数 应用程序 Supertest 测试 express      更新时间:2023-09-26

我有一个简单的快递应用程序,看起来像这样:

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;

我导出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');