2015-06-19 107 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