javascript - 使用 Supertest 测试 Express 应用程序时,对第三方库的构造函数进行 stub

标签 javascript node.js sinon 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();
            })
    })
})

如您所见,我在 stub SendMandrillTemplate 构造函数时遇到问题

如果我没有新建 SendMandrillTemplate 的实例,我可以执行以下操作:

sendTemplateStub = sinon.stub(SendMandrillTemplate, 'sendTemplate')

但是当然,在这种情况下这是行不通的......

最佳答案

你可以通过像这样简单的事情来逃脱

var SendMandrillTemplate = require('send-mandrill-template');
sinon.stub(SendMandrillTemplate.prototype, 'sendTemplate');

关于javascript - 使用 Supertest 测试 Express 应用程序时,对第三方库的构造函数进行 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31341041/

相关文章:

javascript - JS对象键: plus value syntax

javascript - Nuxt - 服务器中间件无法在生产环境中运行

javascript - 将大文件从nodejs上传到另一台服务器

javascript - 如何监视函数

javascript - 生成图像时谷歌图表注释移到后面

node.js - 我得到 yargs.methodName is not a function with all yargs method using ES6 import in NodeJS without Babel

node.js - 如何设置 CSURF (Express Middleware) 以与 Postman 一起工作?

javascript - 使用 es6 测试框架 (AVA) 测试 es5

javascript - 如何为包含 SAPUI5 Core API 的函数编写单元测试?

javascript - 为什么这个 SVG 元素中有隐藏的文本节点?