【问题标题】:Javascript: how to override public method in some class?Javascript:如何覆盖某个类中的公共方法?
【发布时间】:2009-11-18 12:51:46
【问题描述】:

我有这样的 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 的函数。

有什么想法吗?

【问题讨论】:

    标签: javascript ajax unit-testing overriding jsunit


    【解决方案1】:

    查看 YUI 的扩展功能。它使这一切变得非常干净,另外,如果你真的想的话,你仍然可以访问超类的方法。您可能也对他们的增强对象感兴趣。

    这里是链接http://developer.yahoo.com/yui/examples/yahoo/yahoo_extend.html

    【讨论】:

      【解决方案2】:

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

      在您提供的代码示例中,请求对象没有改变。 instance.initRequest 简单地返回对请求的引用。为什么期望它会改变?

      【讨论】:

      • 因为 // 一些使用 initRequest 的 SomeClass 方法的调用
      • 您在通话前后是否使用 FireBug 检查过请求?我发现 FireBug 是不可或缺的。也许您可以发布其他代码?
      【解决方案3】:

      由于您的英语,我在理解您的问题时有些困难,但无论如何我都会尝试回答(如果我回答错误的问题,请告诉我)。

      认为你想做的是:

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

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

      但是,如果您只想为特定对象而不是整个类重写该方法,那么您所拥有的应该可以工作。如果是这种情况,您能否澄清一下到底是什么不起作用?

      【讨论】:

        【解决方案4】:
        SomeClass.prototype.initRequest = function() 
          {  
          return request;
          }  
        

        【讨论】:

          【解决方案5】:

          首先,此代码示例不是 JavaScript 中 OOP 的最佳方式 - 请改用 prototype。另一句话,您的示例在我的浏览器中引发错误(SomeClass 函数的声明无效,可能只是输入错误)。最后,instance.initRequest 实际返回了您所期望的(我已经在 Google Chrome 上运行它)对象 - 请检查 my sample

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-08-26
            • 2021-12-25
            • 2012-09-21
            • 2021-07-09
            • 2012-01-26
            • 2010-12-30
            • 1970-01-01
            相关资源
            最近更新 更多