модульное тестирование функции с потоком чтения - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь проверить следующую функцию с потоком чтения.

module.exports = async (taskDir, taskLogger) => { // add parameter for startPosition?
  if (!fs.existsSync(join(taskDir, 'out.log'))) throw new Error('File Doesn\'t Exists');

  const fileStream = createReadStream(join(taskDir, 'out.log'), {
    encoding: 'utf8',
    start: startPosition,
    tail: true,
  });

  debug('File Stream Created');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity,
  });

  debug('Line Interface Created');

  // Follow the file
  rl.on('line', (line) => {
    outInfo = { currentPosition: fileStream._getBytesRead() };
    debug('Writing Line to File');
    fs.writeFile(join(taskDir, 'outInfo.json'), JSON.stringify(outInfo), () => {});
    debug('Written Line to File');
    taskLogger.log(line);
  });
};

Мой тест сосредоточен вокруг taskLogger.log() вызова. В идеале предполагается, что процесс следует выполнять, а вывод перенаправляется в файл. Я пытаюсь не использовать spawn в тесте и вручную записывать в файл.

Хвостовой модуль достигает точки, где он создает линейный интерфейс, но событие line, похоже, никогда не срабатывает, хотя Я снова пишу в файл после небольшого ожидания. В контексте функции asyncSleep() это обертка вокруг setTimeout(), const asyncSleep = promisify(setTimeout);

describe.only('Testing TAIL Module', () => {
  it('Should Output Data to the Console', async () => {
    // Setup
    fs.removeSync('/tmp/runner-test-task/out.log');
    debug('/tmp/runner-test-task/out.log, REMOVED');
    fs.writeFileSync('/tmp/runner-test-task/out.log', '1');

    if (!fs.existsSync('/tmp/runner-test-task/out.log')) throw new Error('File Doesn\'t Exists');
    debug('/tmp/runner-test-task/out.log CREATED');

    // Test
    const logSpy = sinon.spy(console, 'log');
    tail('/tmp/runner-test-task', logSpy);
    await asyncSleep(500);

    expect(logSpy).to.have.been.called;
    logSpy.resetHistory();

    fs.writeFileSync('/tmp/runner-test-task/out.log', '2');
    await asyncSleep(500);
    expect(logSpy).to.have.been.called;
  });
});

Есть ли возможные причины для этого? И какой лучший способ проверить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...