тайм-аут при тестировании отклонения обещания с помощью sinon и chai-as-обещания - PullRequest
0 голосов
/ 26 мая 2019

У меня есть функция, которая оборачивает третье лицо child-process-promise, которая сама оборачивает spawn в обещание.

let spawn = require('child-process-promise').spawn;


run(cmd, args = []) {
    return new Promise(async (resolve, reject) => {
      let command = spawn(cmd, args);
      let childProcess = command.childProcess;
      let result = '';

      childProcess.stdout.on('data', (data) => {
        result += data.toString();
      });

      try {
        const res = await command;
        resolve(result);
      } catch (err) {
        if (err.code && err.code === 'ENOENT') {
          reject(`Command "${cmd}" not found`);
        } else {
          reject('Exec err' + err);
        }
      }
    });
  }

Проверка разрешения была довольно простой, и мне удалось передать мои данные стандартного вывода в результат, а затем определить chai-as-promised с помощью await expect(shellRun).to.eventually.become('hello world');

Наша проблема заключается в том, что мы пытаемся протестировать часть нашего метода.

const ERROR = 'someError';

beforeEach(() => {
    sandbox = sinon.createSandbox();

    spawnEvent = new events.EventEmitter();
    spawnEvent.stdout = new events.EventEmitter();

    spawnStub = sandbox.stub();
    spawnStub.returns({ childProcess: spawnEvent });

    spawnStub.withArgs(ERRORED, ARGUMENTS).throws(ERROR));

    shell = proxyquireStrict('../../lib/utils/spawnWrapper', {
      'child-process-promise': {
        spawn: spawnStub
      }
    }
    );
  });

  afterEach(() => {
    sandbox.restore();
  });

  describe('when a generic error occurs', () => {
    it('should reject the promise', async () => {
      const shellRun = run(ERRORED, ARGUMENTS);

      await expect(shellRun).to.eventually.be.rejectedWith('Exec err' + ERROR);
    });
  });

Нам удалось заставить childProcessPromiseSpawn условно выдать ошибку, играя с ou spawnStub.withArgs. Но тайм-аут встречается:

(node:15425) UnhandledPromiseRejectionWarning: Error: someError
(node:15425) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 838)

1 failing

  1) run method
       when a generic error occurs
         should reject the promise:
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

Мы попробовали spawnStub.withArgs(ERRORED, ARGUMENTS).rejects вместо throws без особого успеха. Изменение someError на new Error('someError') также не работает.

Мы также пытались поймать на тестовом уровне

try {
  await run(ERRORED, ARGUMENTS);
} catch (e) {
  expect(e).to.equal('Exec err' + ERROR);
}

Но тайм-аут все еще наступает.

1 Ответ

0 голосов
/ 27 мая 2019

Это зависит от того, какую библиотеку тестирования вы используете.Каждая библиотека имеет выделенное время ожидания.

Для Мокко вы можете определить его в наборе тестов или для уникального теста

https://mochajs.org/#timeouts

...