没有调用 Sinon Spy 但调用了原始函数
Sinon Spy not called but original function is called
我的 spy 没有被调用,即使我可以看到原始函数中的控制台日志被调用
摩卡测试:
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);
});
});
快递控制器:
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;
有什么想法吗?
在这些代码行中:
router
.get('/endpoint', MyController.handler)
...您正在传递 MyController.handler
上定义的实际函数。 router.get()
得到的只是对该函数的引用。
当您稍后在测试中将 MyController.handler
包装在间谍中时,这不会改变 router.get()
对原始函数有单独引用的事实。
您需要做的是确保路由处理程序始终调用 MyController.handler()
。将表达式更改为:
router
.get('/endpoint', () => MyController.handler())
我的 spy 没有被调用,即使我可以看到原始函数中的控制台日志被调用
摩卡测试:
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);
});
});
快递控制器:
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;
有什么想法吗?
在这些代码行中:
router
.get('/endpoint', MyController.handler)
...您正在传递 MyController.handler
上定义的实际函数。 router.get()
得到的只是对该函数的引用。
当您稍后在测试中将 MyController.handler
包装在间谍中时,这不会改变 router.get()
对原始函数有单独引用的事实。
您需要做的是确保路由处理程序始终调用 MyController.handler()
。将表达式更改为:
router
.get('/endpoint', () => MyController.handler())