Я пытаюсь проверить следующую функцию с потоком чтения.
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;
});
});
Есть ли возможные причины для этого? И какой лучший способ проверить это?