Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为使用标准输出的东西编写测试?_Javascript_Node.js_Unit Testing_Mocha.js_Bunyan - Fatal编程技术网

Javascript 如何为使用标准输出的东西编写测试?

Javascript 如何为使用标准输出的东西编写测试?,javascript,node.js,unit-testing,mocha.js,bunyan,Javascript,Node.js,Unit Testing,Mocha.js,Bunyan,我正在努力提高这个文件的测试覆盖率 'use strict' /** * Returns the logging options we're using * * @param {String} name Name of the logger. Should be service name. e.g. ciitizen-file-service * @returns {Object} The logging options we're using * @private

我正在努力提高这个文件的测试覆盖率

'use strict'

/**
 * Returns the logging options we're using
 *
 * @param   {String} name Name of the logger. Should be service name. e.g. ciitizen-file-service
 * @returns {Object}      The logging options we're using
 * @private
 */
function getLoggerOptions(name) {
  return {
    name: name,
    streams: [
      {
        level: 'info',
        stream: stdOutStream()
      }, {
        level: 'error',
        stream: stdErrStream()
      }
      , {
        level: 'debug',
        stream: stdOutStream()
      },
      {
        level: 'warn',
        stream: stdOutStream()
      },
      {
        level: 'fatal',
        stream: stdErrStream()
      }
    ]
  }
}

/**
 * Creates a stream that writes to stdout
 *
 * @param   {Object} info The log info
 * @returns {Object}      An object which logs to stdout
 * @private
 */
function stdOutStream() {
  return {
    write: log => {
      // Change log level number to name and write it out
      log.level = bunyan.nameFromLevel[log.level]
      process.stdout.write(JSON.stringify(log) + '\n')
    }
  }
}

/**
 * Creates a stream that writes to stderr
 *
 * @param   {Object} info The log info
 * @returns {Object}      An object which logs to stderr
 * @private
 */
function stdErrStream() {
  return {
    write: log => {
      // Change log level number to name and write it out
      log.level = bunyan.nameFromLevel[log.level]
      process.stderr.write(JSON.stringify(log) + '\n')
    }
  }
}

module.exports = { getLoggerOptions }
我现在有这个测试

'use strict'

const expect = require('chai').expect
const { getLoggerOptions } = require('../src/helpers')

describe.only('#getLoggerOptions', () => {
  it('should return the logger options', () => {
    expect(getLoggerOptions('test')).to.be.an('object')
  })
})
这导致了单元测试覆盖率的差距


如何编写测试来覆盖此代码?

您只是断言
getLoggerOptions(…)
应该返回一个对象,但您没有访问该对象

例如,除了发布的测试之外,请尝试添加一个测试,如:

describe.only('#probeLoggerOptions', () => {
  it('should do expected logging stuff', () => {
    const {name, streams} = getLoggerOptions('test');
    for (let stream of streams) {
      console.log(`getting logopt for level ${stream.level}`);
      expect(stream.stream.write(log), /* ... what to expect */);
    }
  });
});
现在,测试在每个对象中调用
write
函数

EXTRA:如果您拥有代码,最好的方法是将其重构为更易于测试。例如,您可以创建一个
writeablestream
,对其进行写入,然后通过管道传输到所需的
流程,而不是直接写入高级
流程

function configureStream(writable = process.stdout, data = null, msg = 'done') {
  const stream = fs.createReadStream('/tmp/log');
  stream.read(data);
  stream.pipe(writable);
}


除了能够单独测试
configureStream
之外,还可以将每个日志记录过程的内容抽象为一个函数,以减少测试工作量。现在,您还可以连接到流的事件,如“pipe”或“finish”,以检查正在记录的内容。

您的第一个示例失败b/c日志未定义
expect(stream.write(log)
当我将其更改为
expect(stream.write('foo'))
我现在得到错误
TypeError:stream.write不是一个函数
@Catfish
log
没有提供,因为我不知道它。你应该可以自己提供。对不起,
这里有一个属性为
level
stream
的对象,因此你必须调用
stre
am.stream.write(log)
。我更正了它。我正试图遵循您的“额外”,但您的代码不起作用。您无法创建这样的写入流。您需要传递字符串或缓冲区。我将其更改为'const myStream=fs.createWriteStream('foobar')myStream.write('foo')myStream.pipe(myStream)myStream.end()`现在我得到错误
error[ERR\u STREAM\u CANNOT\u PIPE]:CANNOT PIPE,not readable
尝试使用存根(
sinon.stub
)来测试这些功能。创建存根并测试调用了存根函数。
function stdOutStream() {
  return {
    write: log => {
      // Change log level number to name and write it out
      log.level = bunyan.nameFromLevel[log.level];
      configureStream(data = JSON.stringify(log) + '\n');
    }
  }
}