Why is errorFake not being called when I call visually see it's being called (i.e., the message 'message' is logged in the logs ([routes/events] 04:06:16 PM error: message
)?
Code to test
const { scopedLogger } = require(<private module>);
const logger = scopedLogger('routes/events'); // creates scoped Winston logger
/*
* This fails too
* const logging = require(<private module>);
* const logger = logging.scopedLogger('routes/events');
*/
...
const logMessage = function (req, res, next) {
const { level, message } = req.body;
...validation
logger[level](message);
res.status(204).end();
}
router.post('/log', (req, res, next) => logMessage(req, res, next));
Failing Unit Test
const chai = require('chai');
const mongoose = require('mongoose');
const sinon = require('sinon');
const logging = require(<private module>);
...
/* eslint-disable no-unused-vars */
const should = chai.should();
/* eslint-enable no-unused-vars */
chai.use(require('chai-http'));
const {
loginUser, logoutUser, sleep, authenticatedAgent, endSession
} = require('./utils');
...
beforeEach(async () => {
logAgent = await authenticatedAgent(serverUrl, userWithViewerRole) // essentially returns chai.request.agent
});
afterEach(async () => {
await endSession(logAgent);
});
...
it.only('should return 204 when message is logged for level `error`', async () => {
const errorFake = sinon.fake();
const scopedLoggerStub = sinon
.stub()
.returns({ error: errorFake });
sinon.replace(logging, 'scopedLogger', scopedLoggerStub);
const postResponse = await logAgent
.post('/api/events/log')
.send({
level: 'error',
message: 'message',
});
postResponse.should.have.status(204);
errorFake.called.should.be.true; // expected false to be true
sinon.restore();
});
The unit test calls the /api/events/log API, confirms status code 204 is returned, and attempts to confirm that errorFake is called.