我有这样的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
的函数。
任何想法有什么不对?
答案 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。