簡體   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