Node.js+Mocha+Should.js如何测试事件发射器抛出的错误
Node.js + Mocha + Should.js How to test an error being thrown by an eventemitter?
我想测试在我的search.coffee类中抛出错误的情况:
让我们假设,对于我的测试,我可以使用
search.coffee
{ EventEmitter } = require 'events'
connectors = require './connectors'
class Search extends EventEmitter
constructor: (@query, @credentials, dispatch = true) ->
@connectors = @_connectors()
if @connectors.length == 0
# want to test this
@emit 'error', new Error 'Search could not be dispatched to any connectors'
@_dispatch(query, connector) for connector in @connectors if dispatch
我已经尝试了以下操作,但是,由于发出的事件带有错误,new Search()
本身的返回不会引发错误。我怎样才能抓住这个抛出的错误?
search_spec.coffee
Search = require '../../src/search'
describe "search.coffee", ->
describe "constructor", ->
it 'should return an error if no credentials match loaded connectors', ->
new Search("foo", { }, false).should.throw()
should.throw
、assert.Throw
等系统依赖于能够捕获异常。在这里不可能。
现在,出现了一个问题。您正在构造函数中发出'error'
事件。谁有机会调用on
方法来安装侦听器,这样当emit
发生时,某人就会收到它?对象尚未构造。对象本身可以调用on
,但外部的任何人都不能。
选项:
不要将
emit
视为错误,而是将throw
视为错误。由于上面给出的原因,如果这是我的代码,这是我更喜欢的选项。向构造函数添加一个附加参数。这将是
Search
立即安装在自身上的侦听器,用于侦听错误事件。因此,在测试中,可以将侦听器传递给构造函数,然后测试它是否被调用。如果像第一个选项中提到的那样允许调用方安装侦听器是没有意义的,
Search
可以安装自己的侦听器,它可以记录对象已死(例如,this.dead = true
)。然后测试此标志。或者,如果当前的设计和行为是所需的(构造函数发出
'error'
,导致Node.js退出),则修改上一个选项。设计一种方法,向Search
指示它正在测试环境中运行。当它检测到它正在测试中时,它会像前面的选项一样添加一个监听器。
相关文章:
- NodeJS-readline暂停和恢复事件发射器(逐行读取)
- Javascript事件发射器一次处理多个事件
- 无法模拟在 node.js 中使用事件发射器刺激的类中的函数
- Node.js+Mocha+Should.js如何测试事件发射器抛出的错误
- 事件发射器模式如何在Node,sockets.io中工作
- 如何使对象属性函数成为事件发射器
- 您应该如何从节点中的事件发射器继承
- 其他模块中的节点事件发射器
- Angular 2 ES6/7事件发射器更新其他组件
- 绑定事件发射器上的单个事件
- 在模块之间共享的事件发射器
- 为什么在传递/公开事件发射器时需要包装我的事件发射器的 on 函数
- 事件发射器与在 AngularJs 中更新大型数据集时的$watch
- 如何在node中编写事件发射器.js让你创建一个函数“myFunction”,然后在运行时调用成功或失败
- 将立即调用的函数表达式 (IIFE) 与事件发射器一起使用
- 在扩展事件发射器的 ES6 类定义中设置事件侦听器
- 警告:可能检测到事件发射器内存泄漏.添加了 11 个 AppUp > 听众.使用 emitter.setMaxListe
- 节点.js事件发射器源代码的说明
- 从事件发射器继承的对象不会引发事件
- process.on('uncaughtException')的令人困惑的事件发射器/闭包模式