使用Mocha从异步功能测试控制台输出(process.stdout.write)

时间:2018-10-29 21:43:49

标签: javascript node.js mocha

我在node.js的异步函数中捕获process.stdout.write时遇到问题。我已经阅读了很多其他人的解决方案,并且缺少明显的内容,但是我不知道这是什么。我找到了适用于同步功能的解决方案here,但无法使异步功能正常工作。我已经尝试了两种本地解决方案以及test-console.js库。

这是我要测试的功能:

\

test-console.js库中的文档说要像这样测试异步功能:

const ora = require('ora')

const coinInserted = (totalInserted) => {
  const spinner = ora('    KA-CHUNK').start();
  const output = `Amount Inserted: $${(totalInserted / 100).toFixed(2)}`;
  setTimeout(() => {
    spinner.text = `    ${output}`;
    spinner.color = 'green';
    spinner.succeed();
      process.stdout.write('Please Insert Coins > ');
    }, 500);
};

...但是我不明白functionUnderTest的语法。我认为我必须修改要测试的函数以接受回调函数,在其中我将其称为测试(检查和断言)函数?但这似乎也不起作用。

1 个答案:

答案 0 :(得分:0)

由于您使用setTimeout(),所以我们可以使用sinon.useFakeTimers模拟超时。

这里是例子

const chai = require('chai');
const assert = chai.assert;
const sinon = require('sinon');
const proxyquire = require('proxyquire');

const succeedStub = sinon.stub(); // try to make the expectation this method is called
const index = proxyquire('./src', {
  'ora': (input) => ({ // try to mock `ora` package
    start: () => ({
      text: '',
      color: '',
      succeed: succeedStub
    })
  })
})

describe('some request test', function() {    
  it('responses with success message', function() {    
    const clock = sinon.useFakeTimers(); // define this to emulate setTimeout()

    index.coinInserted(3);
    clock.tick(501); // number must be bigger than setTimeout in source file

    assert(succeedStub.calledOnce); // expect that `spinner.succeed()` is called
  });
})

参考: