【问题标题】:How to mock an EventEmitter on `createReadStream`?如何在`createReadStream`上模拟EventEmitter?
【发布时间】:2017-01-27 12:26:25
【问题描述】:

我正在尝试编写一个测试用例,用于测试由于此代码而引发的错误:

s3.getObject({
    Bucket: mediaBucket,
    Key: mediaId,
  }).createReadStream()

我使用虚拟 S3 对象进行了测试,并且我正在使用 MemoryStream 来涵盖调用成功的情况。如何发出错误,以便我可以编写一个测试来测试.on('error') function(error).. 中的行为?

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

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

【问题讨论】:

    标签: javascript node.js node-streams


    【解决方案1】:

    就像发出任何其他事件一样发出它:

    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() 发出错误,因为这会给调用者附加error 事件处理程序的时间。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2011-02-23
    • 1970-01-01
    • 2017-02-13
    • 2012-05-15
    • 1970-01-01
    • 2021-03-17
    • 2010-11-09
    相关资源
    最近更新 更多