[英]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()
是的,没有任何东西扔在这里。 如果未安装事件侦听器,则默认行为是Node打印堆栈跟踪并退出。 它看起来像一个抛出的异常,但你无法捕捉它。 像should.throw
, assert.Throw
等系统依赖于能够捕获异常。 这里不可能。
现在,有一个问题。 您正在构造函数中发出'error'
事件。 谁有机会调用on
方法来安装一个监听器,这样当这个emit
发生时, 有人会收到它? 该对象尚未构建。 该对象可以自己调用on
但外面没有人可以。
选项:
不emit
错误,而是throw
错误。 由于上面给出的原因,如果这是我的代码,这是我更喜欢的选项。
向构造函数添加其他参数。 这将是一个监听器, Search
会立即自行安装以侦听错误事件。 所以在测试中,可以将一个监听器传递给构造函数,然后测试它是否被调用。
如果允许调用者安装第一个选项中提到的侦听器没有意义,则Search
可以安装自己的侦听器,该侦听器可以记录该对象已死(例如, this.dead = true
)。 然后测试这个标志。
或者,如果当前的设计和行为是所需的(构造函数发出'error'
,导致Node.js退出),请修改上一个选项。 设计一种方法来向Search
表明它在测试环境中运行。 当它检测到它正在测试时,它会像上一个选项一样添加一个监听器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.