Javascript:如何在某些类中覆盖公共方法?

时间:2009-11-18 12:51:47

标签: javascript ajax unit-testing override jsunit

我有这样的JS类需要测试:

SomeClass = function {  
    // some stuff that uses initRequest    
    this.initRequest = function() {  
        if (window.XMLHttpRequest) {  
            return new XMLHttpRequest();  
        } else if (window.ActiveXObject) {  
            return new ActiveXObject("Microsoft.XMLHTTP");  
        }   
     }  
}

我想覆盖方法initRequest以进行测试。我试着做那样的事情

var request = new MockXmlHttpRequest();  
var instance = new SomeClass();
instance.initRequest = function() {
    return request;
};
// some calls of the SomeClass methods that use initRequest
// some test code with assertions for the request

仍然调用initRequest方法实际上是调用原始代码,而不是我尝试传递给instance.initRequest的函数。

任何想法有什么不对?

5 个答案:

答案 0 :(得分:0)

查看YUI的扩展功能。它使所有这些都非常干净,加上你仍然可以访问超类的方法,如果你真的想要的话。他们的增强对象也可能是您感兴趣的。

以下是链接http://developer.yahoo.com/yui/examples/yahoo/yahoo_extend.html

答案 1 :(得分:0)

在第一个示例中,initRequest在每次调用后返回一个新对象;在第二个示例中,对initRequest的所有调用都返回对唯一(模拟)对象的引用。

您提供的代码示例中未更改请求对象。 instance.initRequest simple返回对请求的引用。为什么期望它发生变化?

答案 2 :(得分:0)

由于你的英语,我在理解你的问题时遇到了一些麻烦,但无论如何我都会尝试回答(如果我回答错误的问题,请告诉我)。

你想做的是:

SomeClass = function {  
    // some stuff that uses initRequest    
    this.initRequest = function() {  
        return request;
     }  
}

换句话说,您希望使用新函数覆盖原始SomeClass对象。除非你这样做,否则新的SomeClass对象将不会使用你的测试方法,他们只会使用原始方法。

但是,如果您只想覆盖特定对象的方法,而不是整个类,那么您应该使用的方法。如果是这样的话,你能否澄清一下究竟是什么不起作用?

答案 3 :(得分:0)

SomeClass.prototype.initRequest = function() 
  {  
  return request;
  }  

答案 4 :(得分:-1)

首先,此代码示例不是JavaScript中OOP的最佳方式 - 请改用prototype。另一个评论,你的示例在我的浏览器中抛出错误(SomeClass函数声明无效,可能只是输入错误)。最后,instance.initRequest实际上返回了(我在谷歌浏览器上运行它)您预期的对象 - 请查看my sample