2015-06-19 93 views
1

當我試圖測試下面的代碼錯誤類型的錯誤:測試JavaScript函數

/** ABSTRACT METHOD PLACEHOLDER */ 
MyResult.prototype.get = throwNotImplementedError; 

function throwNotImplementedError(resultId) { 
    throw new NotImplementedError('Please implement in Item Groups and Items. This call is abstract'); 
} 

與下面的測試。

it('should have a placeholder for get', function(){ 
    expect(function(){return MyResult.get(123);}).toThrowError(NotImplementedError); 
}); 

最後發生的是TypeError被拋出而不是我自定義的NotImplementedError。類型錯誤的消息是:「MyResult.get不是函數」。

我想知道它是否可能與調用原型中的變量有關'獲取',但我想我已經看到這樣的例子,他們命名的JavaScript類和使用他們調用的自定義方法獲取。它似乎適用於其他呼叫。

對於此調用不起作用的原因,您有任何建議嗎?

+0

僅供參考其他任何人。 SLaks和Tao讓我知道原型只適用於實例化的類。爲了能夠將該方法用作「類方法」,我必須排除術語原型,並確保使用名稱來稱呼它。例如聲明它MyResult.get = function(){...};並使用它像MyResult.get(); – ThinkBonobo

回答

1

這是一個原型功能

所以你必須測試get功能有這樣一個對象的實例:

it('should have a placeholder for get', function(){ 
    var resultObj = new MyResult(); // Create an instance of your object 
    expect(function(){return resultObj.get(123);}).toThrowError(NotImplementedError); 
}); 
+0

感謝您的快速響應,所以讓我說,我希望該類有靜態方法,基本上會像工廠創建一個MyResult對象(或MyResult對象列表)我將如何創建它?我會排除單詞原型嗎? – ThinkBonobo

+0

當你在一個原型對象中實現一個函數時,它不是靜態的。它是類的類OOP方法(在你的情況下,'MyResult'就像一個類一樣)。 –

4

錯誤是完全正確的。

您定義了MyResult.prototype.get,與MyResult.get無關。

您可能想要創建一個實例。

+0

謝謝!如果你有時間,也許你可以澄清一點。我認爲原型繼承將使得MyResult.get(如果沒有任何東西)會查找原型,並發現MyResult.prototype.get有一個方法,因此使用它。你能不能在思考中解決我的失誤? – ThinkBonobo

+0

@ThinkBonobo:序號原型繼承對類_instances_(例如'new MyResult()')有效。'MyResult'本身是'Function'的一個實例,並且繼承了它的原型。 – SLaks

+0

感謝您的澄清。找出另一種方法將我的'工廠方法'扔進我的代碼然後 – ThinkBonobo