2015-11-22 49 views
7

我試圖實現在JavaScript中學習測試驅動開發方面打印鑽石的功能。茉莉花拋出錯誤期望().Throw而不是識別拋出的錯誤

Diamond.prototype.outerSpace = function (current, widest) { 

    var currentValue = this.getIndexOf(current); 
    var widestValue = this.getIndexOf(widest); 

    if (currentValue > widestValue) { 
     throw new Error('Invalid combination of arguments'); 
    } 

    var spaces = widestValue - currentValue; 
    return new Array(spaces + 1).join(' '); 
}; 

我在錯誤處理中遇到問題。如果currentValue大於widestValue,上面的函數應該會拋出一個錯誤。

這是代表在測試/規格我的片斷:

it ("should throw an exception, if it is called with D and C", function() { 
    var outerSpace = diamond.outerSpace.bind(diamond, 'D', 'C'); 
    expect(outerSpace).toThrow('Invalid combination of arguments'); 
}); 

我也試圖與一個匿名函數在期待(..),但是這也沒有工作。

控制檯消息是:預期的函數拋出'Inval ...'但它拋出錯誤:無效的參數組合。

我不明白,我該怎麼處理這些信息。

編輯:這很奇怪,因爲它與Jasmine v.1.3一起工作,但它並不適用於茉莉花v.2.3,即與業力,儘管基於茉莉花的代碼。

回答

9

TL; DR

茉莉花2匹配器語義變化,有一個新的匹配。

使用​​或toThrow(new Error("<message>")))

NTL; TR

由於茉莉花2.x中有一個新的匹配器toThrowError()和茉莉的toThrow()成爲一個新的語義。

  • toThrow()應該用來檢查是否任何錯誤是扔或檢查的Error的消息:
  • toThrowError()應該用來檢查一個特定(更具體的成才這是instanceof Error)錯誤被拋出,或者錯誤消息等於期望值

內部toThrow(x)對拋出的錯誤進行相等檢查,對x。如果錯誤和x都是instanceof Error(例如對於TypeError也是如此)Jasmine將檢查兩側message屬性的平等(一般爲===)。

形式toThrowError(x)檢查錯誤消息是否等於或x(字符串或正則表達式)

另一種形式toThrowError(t, x)檢查錯誤是否是t類型的匹配,並且信息等於或x匹配(字符串或正則表達式)

參見