Как тестировать CLI Node.js с Jest? - PullRequest
0 голосов
/ 17 мая 2018

Я застрял в самом начале, просто требуя CLI и фиксируя его вывод.Я пробовал два метода, но оба не работают.

Это мой cli.js:

#!/usr/bin/env node

console.log('Testing...');
process.exit(0);

А это мой cli.test.js:

test('Attempt 1', () => {
    let stdout = require("test-console").stdout;
    let output = stdout.inspectSync(function() {
        require('./cli.js');
    });
    expect(output).toBe('Testing...');
});

test('Attempt 2', () => {
    console.log = jest.fn();
    require('./cli.js');
    expect(console.log.calls).toBe(['Testing...']);
});

Не имеет значения, какой тест в действительности выполняется, вывод всегда:

$ jest

 RUNS  bin/cli.test.js
Done in 3.10s.

1 Ответ

0 голосов
/ 17 мая 2018

Приложения CLI Node.js ничем не отличаются от других приложений, за исключением зависимости от среды. Предполагается, что они широко используют process участников, например ::1002 *.

  • process.stdin
  • process.stdout
  • process.argv
  • process.exit

Если какие-либо из этих вещей используются, они должны быть проверены и протестированы соответственно.

Поскольку console.log вызывается напрямую для вывода, нет проблем с его непосредственным шпионажем, хотя можно использовать и вспомогательные пакеты, такие как test-console.

В этом случае process.exit(0) вызывается в импортированном файле, поэтому файл спецификаций преждевременно завершается, а следующий Done вывод - из родительского процесса. Это должно быть заглушки. Выдача ошибки необходима, чтобы выполнение кода было остановлено - для имитации нормального поведения:

test('Attempt 2', () => {
    const spy = jest.spyOn(console, 'log');
    jest.spyOn(process, 'exit').mockImplementationOnce(() => {
      throw new Error('process.exit() was called.')
    });

    expect(() => {
      require('./cli.js');
    }).toThrow('process.exit() was called.');
    expect(spy.mock.calls).toEqual([['Testing...']]);
    expect(process.exit).toHaveBeenCalledWith(0);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...