0

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.

0 Answers0