Sinon Spy未调用,但原始功能被调用

时间:2018-08-10 09:18:02

标签: javascript mocha sinon supertest sinon-chai

即使我可以看到原始函数中的控制台日志被调用,也不会调用我的间谍

摩卡测试:

const { expect } = require('chai');
const supertest = require('supertest');
const MyController = require('../../Controllers/MyController');
const sandbox = require('sinon').createSandbox();
const app = require('../../app');

describe('GET /endpoint', () => {
    it('calls handler', (done) => {
        const mySpy = sandbox.spy(MyController, 'handler');

        supertest(app)
            .get('/endpoint')
            .expect(() => {
                expect(mySpy.called).to.be.true;
            })
            .end(done);
    });
});

Express控制器:

function handler(request, response) {
    console.log('I can see this method being called');
    return response.sendStatus(200);
}

module.exports = {
    handler
};

快速路由器:

const router = require('express').Router();
const MyController = require('../Controllers/MyController');

router
    .get('/endpoint', MyController.handler);

module.exports = router;

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在这些代码行中:

router
    .get('/endpoint', MyController.handler)

...您正在传递在MyController.handler上定义的实际函数。 router.get()得到的只是对该函数的引用。
稍后,在测试中,将MyController.handler包裹在一个间谍程序中,这不会改变router.get()具有对原始函数的单独引用的事实。

您需要做的是确保路由处理程序始终调用MyController.handler()。将表达式更改为此:

router
    .get('/endpoint', () => MyController.handler())