gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:00:37 27 4
gpt4 key购买 nike

我想测试在我的 search.coffee 类中抛出错误的情况:

假设对于我的测试,我 cn fo

搜索咖啡

{ 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()

最佳答案

是的,这里没有抛出任何东西。 default behavior如果没有安装事件监听器,Node 将打印堆栈跟踪并退出。它看起来像是抛出了异常,但你无法捕获它。 should.throwassert.Throw 等系统依赖于捕获异常的能力。这里不可能。

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

选项:

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

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

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

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

关于javascript - Node.js + Mocha + Should.js 如何测试事件发射器抛出的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20579730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com