Node.js + Mocha + Should.js如何测试eventemitter抛出的错误?

时间:2013-12-14 04:37:33

标签: javascript node.js coffeescript

我想测试我的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()

1 个答案:

答案 0 :(得分:2)

是的,这里没有抛出。如果没有安装事件侦听器,则default behavior用于Node打印堆栈跟踪并退出。它看起来像一个抛出的异常,但你无法捕捉它。像should.throwassert.Throw等系统依赖于能够捕获异常。这里不可能。

现在,有一个问题。您正在构造函数中发出'error'事件。谁有机会调用on方法来安装监听器,以便在emit发生这种情况时,某人会收到它?该对象尚未构建。该对象可以自己调用on但外面没有人可以。

选项:

  1. 不要emit出错,而是throw出错。由于上面给出的原因,如果这是我的代码,这是我更喜欢的选项。

  2. 向构造函数添加其他参数。这将是Search立即安装以监听错误事件的监听器。所以在测试中,可以将一个监听器传递给构造函数,然后测试它是否被调用。

  3. 如果允许调用者安装第1个选项中提到的侦听器没有意义,Search可以安装自己的侦听器,这可以记录该对象已死(例如, this.dead = true)。然后测试这个标志。

  4. 或者,如果当前的设计和行为是所需的(构造函数发出'error',导致Node.js退出),请修改上一个选项。设计一种方法来向Search表明它在测试环境中运行。当它检测到它正在测试时,它会添加一个类似于上一个选项的监听器。