我想测试我的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()
答案 0 :(得分:2)
是的,这里没有抛出。如果没有安装事件侦听器,则default behavior用于Node打印堆栈跟踪并退出。它看起来像一个抛出的异常,但你无法捕捉它。像should.throw
,assert.Throw
等系统依赖于能够捕获异常。这里不可能。
现在,有一个问题。您正在构造函数中发出'error'
事件。谁有机会调用on
方法来安装监听器,以便在emit
发生这种情况时,某人会收到它?该对象尚未构建。该对象可以自己调用on
但外面没有人可以。
选项:
不要emit
出错,而是throw
出错。由于上面给出的原因,如果这是我的代码,这是我更喜欢的选项。
向构造函数添加其他参数。这将是Search
立即安装以监听错误事件的监听器。所以在测试中,可以将一个监听器传递给构造函数,然后测试它是否被调用。
如果允许调用者安装第1个选项中提到的侦听器没有意义,Search
可以安装自己的侦听器,这可以记录该对象已死(例如, this.dead = true
)。然后测试这个标志。
或者,如果当前的设计和行为是所需的(构造函数发出'error'
,导致Node.js退出),请修改上一个选项。设计一种方法来向Search
表明它在测试环境中运行。当它检测到它正在测试时,它会添加一个类似于上一个选项的监听器。