Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将流、承诺和管道一起编写单元测试?_Javascript_Unit Testing_Stream_Mocha.js - Fatal编程技术网

Javascript 如何将流、承诺和管道一起编写单元测试?

Javascript 如何将流、承诺和管道一起编写单元测试?,javascript,unit-testing,stream,mocha.js,Javascript,Unit Testing,Stream,Mocha.js,我的职能是 exports.downloadFromBucket = function(fileKey) { const localPath = `${process.cwd()}/data/${fileKey}` return new Promise((resolve, reject) => { const localFile = fs.createWriteStream(localPath) const awsStream = s3.getObject({

我的职能是

exports.downloadFromBucket = function(fileKey) {
  const localPath = `${process.cwd()}/data/${fileKey}`

  return new Promise((resolve, reject) => {
    const localFile = fs.createWriteStream(localPath)
    const awsStream = s3.getObject({
      Bucket: process.env.UPLOAD_BUCKET,
      Key: fileKey
    })
    .createReadStream()
    .on('error', (err) => {
      logger.info('Error downloading file', err)
      return reject(err)
    })
    .on('finish', () => {
      logger.info('Completed downloading')
      return resolve(localPath)
    })
    .pipe(localFile)
  })
}

我如何使用
mocha
sinon
为此编写单元测试?

这可能不是最漂亮的解决方案,但假设您想要模拟
s3
fs
并测试
上的('error')
上的('finish')
行为:

您可以使用自定义的s3模拟类,用sinon存根原始s3和fs,并触发要测试的事件

// Custom S3 Mocking Library
class S3MockLibrary {
  constructor() {
    this.events = {};
  }
  getObject(options) {
    return this;
  }
  createReadStream() {
    return this;
  }
  on(event, func) {
    this.events[event] = func;
    return this;
  }
  pipe(file) {
    return this;
  }
  emit(event, err) {
    this.events[event](err);
  }
}
测试(‘完成’)

测试('错误)


我得到一个错误:`TypeError:s3.getObject(…).pipe不是一个函数`Works在我的测试文件中。您是否在使用
严格
模式?您使用哪个节点版本?我猜
s3.getObject(…).pipe
未定义的
还是
空的
it('should verify', async () => {
  const s3Mock = new S3MockLibrary();
  const fsStub = sinon.stub(fs, 'createWriteStream').returns('success');
  const s3Stub = sinon.stub(s3, 'getObject').returns(s3Mock);

  // Emit the finish event async
  setTimeout(() => {
    s3Mock.emit('finish');
  }, 0);
  const result = await downloadFromBucket('test');

  fsStub.restore();
  s3Stub.restore();

  sinon.assert.calledOnce(fsStub);
  sinon.assert.calledOnce(s3Stub);

  assert.equal(result, `${process.cwd()}/data/test`);
});
it('should fail', async () => {
  const s3Mock = new S3MockLibrary();
  const fsStub = sinon.stub(fs, 'createWriteStream').returns('success');
  const s3Stub = sinon.stub(s3, 'getObject').returns(s3Mock);

  setTimeout(() => {
    s3Mock.emit('error', 'testError');
  }, 0);
  let error;
  await downloadFromBucket('test').catch((err) => {
    error = err;
  });

  fsStub.restore();
  s3Stub.restore();

  sinon.assert.calledOnce(fsStub);
  sinon.assert.calledOnce(s3Stub);

  assert.equal(error, 'testError');
});