[英]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.throw
, assert.Throw
等系統依賴於能夠捕獲異常。 這里不可能。
現在,有一個問題。 您正在構造函數中發出'error'
事件。 誰有機會調用on
方法來安裝一個監聽器,這樣當這個emit
發生時, 有人會收到它? 該對象尚未構建。 該對象可以自己調用on
但外面沒有人可以。
選項:
不emit
錯誤,而是throw
錯誤。 由於上面給出的原因,如果這是我的代碼,這是我更喜歡的選項。
向構造函數添加其他參數。 這將是一個監聽器, Search
會立即自行安裝以偵聽錯誤事件。 所以在測試中,可以將一個監聽器傳遞給構造函數,然后測試它是否被調用。
如果允許調用者安裝第一個選項中提到的偵聽器沒有意義,則Search
可以安裝自己的偵聽器,該偵聽器可以記錄該對象已死(例如, this.dead = true
)。 然后測試這個標志。
或者,如果當前的設計和行為是所需的(構造函數發出'error'
,導致Node.js退出),請修改上一個選項。 設計一種方法來向Search
表明它在測試環境中運行。 當它檢測到它正在測試時,它會像上一個選項一樣添加一個監聽器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.