我想测试在我的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()
should.throw
、assert.Throw
等系统依赖于能够捕获异常。在这里不可能。
现在,出现了一个问题。您正在构造函数中发出'error'
事件。谁有机会调用on
方法来安装侦听器,这样当emit
发生时,某人就会收到它?对象尚未构造。对象本身可以调用on
,但外部的任何人都不能。
选项:
不要将
emit
视为错误,而是将throw
视为错误。由于上面给出的原因,如果这是我的代码,这是我更喜欢的选项。向构造函数添加一个附加参数。这将是
Search
立即安装在自身上的侦听器,用于侦听错误事件。因此,在测试中,可以将侦听器传递给构造函数,然后测试它是否被调用。如果像第一个选项中提到的那样允许调用方安装侦听器是没有意义的,
Search
可以安装自己的侦听器,它可以记录对象已死(例如,this.dead = true
)。然后测试此标志。或者,如果当前的设计和行为是所需的(构造函数发出
'error'
,导致Node.js退出),则修改上一个选项。设计一种方法,向Search
指示它正在测试环境中运行。当它检测到它正在测试中时,它会像前面的选项一样添加一个监听器。