使用Sinon截除Pino的问题



我正试图为运行时返回Pino日志消息的服务函数编写单元测试。我已经使用Sinon从service.js中使用的记录器模块构建了一个存根,但未能成功进行测试。测试返回:AssertionError:预期错误被调用了一次,但它被调用了0次

理想情况下,我希望能够断言记录器被调用,并且该函数返回了确切的记录器调用和消息。

下面是我试图实现的一些示例代码

logger.js

const pino = require('pino');
const defaultLogger = pino({}, 'output.log');

module.exports = {
defaultLogger
}

service.js

const path = require('path');
const { defaultLogger } = require('../common/logger');
const logger = defaultLogger.child({ filename: path.basename(__filename) });
const logResponse = () => {
return logger.info('successful');
};

service.test.js

const sinon = require('sinon');
const chai = require('chai');
const sinonChai = require('sinon-chai');
const service = require('../service.js')
const { defaultLogger } = require('../common/logger');
const { expect } = chai;
chai.should();
chai.use(sinonChai);
describe('Service Test', () => {
it('should return a log message', () => {
const spy = sinon.spy(service, 'logResponse')
const stub = sinon.stub(defaultLogger, 'error');
spy.should.have.been.calledOnce;
expect(stub).to.have.been.calledOnce;
spy.should.have.returned(logger.info('successful'));
})
})

这是单元测试解决方案:

./logger.js:

const pino = require('pino');
const defaultLogger = pino({}, 'output.log');
module.exports = {
defaultLogger,
};

./service.js:

const path = require('path');
const { defaultLogger } = require('./logger');
const logger = defaultLogger.child({ filename: path.basename(__filename) });
const logResponse = () => {
return logger.info('successful');
};
module.exports = {
logResponse,
};

./service.test.js:

const { defaultLogger } = require('./logger');
const sinon = require('sinon');
const chai = require('chai');
const { expect } = chai;
describe('63618186', () => {
it('should return a log message ', () => {
const loggerStub = {
info: sinon.stub().returns('anything'),
};
sinon.stub(defaultLogger, 'child').returns(loggerStub);
const service = require('./service');
const actual = service.logResponse();
expect(actual).to.be.equal('anything');
sinon.assert.calledOnce(defaultLogger.child);
sinon.assert.calledWithExactly(loggerStub.info, 'successful');
});
});

带覆盖率报告的单元测试结果:

63618186
✓ should return a log message 

1 passing (41ms)
------------|---------|----------|---------|---------|-------------------
File        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------|---------|----------|---------|---------|-------------------
All files   |     100 |      100 |     100 |     100 |                   
logger.js  |     100 |      100 |     100 |     100 |                   
service.js |     100 |      100 |     100 |     100 |                   
------------|---------|----------|---------|---------|-------------------

最新更新