Javascript 如何在“createReadStream”上模拟EventEmitter?

Javascript 如何在“createReadStream”上模拟EventEmitter?,javascript,node.js,node-streams,Javascript,Node.js,Node Streams,我正在尝试编写一个测试用例,用于测试以下代码导致的错误: s3.getObject({ Bucket: mediaBucket, Key: mediaId, }).createReadStream() 我用一个虚拟S3对象做了一个测试,我使用MemoryStream来覆盖调用成功的情况。如何发出错误,以便编写一个测试,允许我在.on('error')函数(error)中测试行为 以下是我尝试过的,但没有成功: beforeEach(function () { var

我正在尝试编写一个测试用例,用于测试以下代码导致的错误:

s3.getObject({
    Bucket: mediaBucket,
    Key: mediaId,
  }).createReadStream()
我用一个虚拟S3对象做了一个测试,我使用MemoryStream来覆盖调用成功的情况。如何发出错误,以便编写一个测试,允许我在
.on('error')函数(error)
中测试行为

以下是我尝试过的,但没有成功:

beforeEach(function () {
   var emitter = new EventEmitter;
   const s3 = {
     getObject: () => {
       return { createReadStream: () => emitter.emit('error', new Error('Random error!')) }
     },
};

只需像发射任何其他事件一样发射它:

stream.emit('error', new Error('Random error!'));
因此,上面的代码应该如下所示:

const s3 = {
  getObject: () => {
    return { createReadStream: () => {
      process.nextTick(function() {
        emitter.emit('error', new Error('whoops!'));
      });
      return emitter;
    } }
  },
};

只需像发射任何其他事件一样发射它:

stream.emit('error', new Error('Random error!'));
因此,上面的代码应该如下所示:

const s3 = {
  getObject: () => {
    return { createReadStream: () => {
      process.nextTick(function() {
        emitter.emit('error', new Error('whoops!'));
      });
      return emitter;
    } }
  },
};

我更新了我的问题,以显示我在做什么。我试图发出一个错误,很明显我做错了什么。你需要先返回发射器。然后使用
process.nextTick()
/
setImmediate()
发出错误,因为这将给调用方留出时间附加
错误事件处理程序。我更新了我的问题,以准确显示我在做什么。我试图发出一个错误,很明显我做错了什么。你需要先返回发射器。然后使用
process.nextTick()
/
setImmediate()
发出错误,因为这将使调用方有时间附加
错误事件处理程序。