Node.js+Mocha+Should.js如何测试事件发射器抛出的错误

Node.js + Mocha + Should.js How to test an error being thrown by an eventemitter?

本文关键字:发射器 事件 错误 测试 js js+Mocha+Should 何测试 Node      更新时间:2023-09-26

我想测试在我的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指示它正在测试环境中运行。当它检测到它正在测试中时,它会像前面的选项一样添加一个监听器。