问题
我有以下要测试的javascript文件:
function myLocalHouse() {
this.init = function() {
$.post(//Ajax call using jQuery);
};
this.buyHouse(money, date) {
//code I want to test with mocha
};
this.init();
};
如您所见,
init
方法使用jQuery,当我在控制台中执行mocha
进行测试时,由于找不到$
对象而失败。所以我的解决方案是覆盖和伪造
init
方法。问题是我的尝试失败了。好难过。我尝试过的
这是我尝试测试
myLocalHouse
的测试,也是我尝试覆盖init方法以使用空函数的三个尝试。 var myLocalHouse = require('./myLocalHouse.js').myLocalHouse;
suite('houses suite', function() {
test('test that buy House works correctly', function() {
//First attemp at overriding init method: FAILED
myLocalHouse.prototype.init = function() {};
//Second attemp at overriding init method: FAILED
myLocalHouse.__proto__.init = function() {};
var myLocalHouseInstance = new myLocalHouse();
//Third attemp at overriding init method: FAILED
myLocalHouseInstance.prototype.init = function() {};
var something = myLocalHouseInstance.buyHouse(100, '17/08/2013');
});
});
我只是...我不知道如何覆盖
init
方法。我做错了吗?还有另一种方法可以做同样的事情吗?
最佳答案
如果您根本不想修改旧版代码中的任何内容,则可以使用以下方法:
function myTestHouse() {
Object.defineProperty(this, 'init', {
set: function() { /* Ignore setter */ },
get: function() { return function() { /* dummy*/}; },
enumerable: true
});
var _this = myLocalHouse.apply(this, arguments);
return _this || this;
};
myTestHouse.prototype = myLocalHouse.prototype;
// Usage
var myLocalHouseInstance = new myTestHouse();
使用
Object.defineProperty
,我定义了一个只读方法,它默默地忽略了setter。之后,我使用myLocalTestHouse
调用原始构造函数(apply
)。注意:此方法是完全透明的。创建的实例的行为就像您正在调用原始构造函数一样。