2016-09-19 58 views
0

我试图写一个测试用例时错误地发出这个代码的结果:如何模拟`createReadStream`上的EventEmitter?

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!')) } 
    }, 
}; 

回答

2

就发出像使用任何其他事件:

stream.emit('error', new Error('Random error!')); 

所以,上面的代码应该是这样的:

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

我更新了我的问题,以准确显示我在做什么。我试图发出一个错误,我只是明确地做错了什么。 –

+0

您需要先*返回发射器。然后使用'process.nextTick()'/'setImmediate()'发出错误,因为这会给调用者留下时间来附加'error'事件处理程序。 – mscdex

+0

谢谢,那就是诀窍! –