Как я могу заглушить ошибку из потока узла, используя sinon? - PullRequest
0 голосов
/ 14 января 2019

Я тестирую подключаемый модуль gulp, который использует child_process.spawn , и я пытаюсь шпионить за порождением, чтобы я мог вернуть ошибку. С помощью sinon я безуспешно пытался использовать возвраты и броски.

index.js
--------
const cp = require('child_process');
const PluginError = require('plugin-error');
const through = require('through2');

module.exports = () => {
  return through.obj(function (file, enc, cb) {
    const convert = cp.spawn('convert');

    convert.on('error', (err) => {
      cb(new PluginError(PLUGIN_NAME, 'ImageMagick not installed'));
      return;
    });
  });
}

test.js
-------
const cp = require('child_process');
const expect = require('chai').expect;
const plugin = require('../index');
const sinon = require('sinon');
const Vinyl = require('vinyl');

it('error when ImageMagick not installed', (done) => {
  sinon.stub(cp, 'spawn'); // Problem area: I tried .returns and .throws
  const vinyl = new Vinyl();

  const stream = plugin();
  stream.write(vinyl);
  stream.once('error', (error) => {
    expect(error);
    done();
  });
});

1 Ответ

0 голосов
/ 15 января 2019

Я забыл заглушить дочерний процесс, который возвращает spawn!

let mockProcess = {
  on: sinon.stub(),
  stdout: {
    on: sinon.stub()
  },
  stderr: {
    on: sinon.stub()
  }
};
mockProcess.on.withArgs('error').yieldsAsync(new Error());
sinon.stub(cp, 'spawn').returns(mockProcess);
...