繁体   English   中英

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

[英]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.throwassert.Throw等系统依赖于能够捕获异常。 这里不可能。

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

选项:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM