Search code examples
javascriptnode.jstestingsinonbunyan

spying on bunyan log - NodeJS


Is there any way in which I can spy on the bunyan log to ensure I print out what I expect?

MyFile.js

const bunyan = require('bunyan');
const log = bunyan.createLogger({name: 'FailureAuditService'});

class someClass {
   someFunct() {
     if(x) {
        log.warn('something happened');
     }
   }
}

Test

const service = require(../MyFile);

describe('test something', () => {
    it('Will test the bunyan log', res => {
       let consoleLog = sinon.spy(log, 'createLogger');
       let x = true;

       service.someClass(x).then(res => {
          let expected = 'something happened';
          consoleLog.should.equal(expected);
       });
    });
})

Solution

  • I worked around this with the following:

    const mockReq = require('mock-require);
    
    ...
    
    let infoStub = sinon.stub();
    let warnStub = sinon.stub();
    
    logStubs = {
       info: infoStub,
       warn: warnStub
       // any other log methods you wish to use
    };
    
    mockReq('bunyan', {
       createLogger() {
          return logStubs;
       }
    });
    
    ...
    

    I then used to mockReq.reRequire() function later on to reset the cache of the service I was wanting to mock.

    To assert the actual content of the logs:

    let infoLog = infoStub.firstCall.args[0];
    let warnLog = warnStub.firstCall.args[0];
    

    With this, I could assert them to equal whatever I expected.