1

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

有什么想法有什么问题吗?

4

5 回答 5

0

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

你想做的是:

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

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

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

于 2009-11-19T00:57:38.260 回答
0

In your first example, initRequest returns a new object after each call; in the second example, all calls to initRequest return a reference to the one and only (mock) object.

The request object is not changed in the code example you provide. instance.initRequest simple returns a reference to request. Why do expect it to have changed?

于 2009-11-18T14:40:13.700 回答
0
SomeClass.prototype.initRequest = function() 
  {  
  return request;
  }  
于 2013-03-07T02:25:47.427 回答
0

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

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

于 2009-11-18T12:56:24.080 回答
-1

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

于 2011-11-01T23:11:46.110 回答