我有以下要测试的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
方法。
我做错了什么?还有另一种方法可以做同样的事情吗?
答案 0 :(得分:2)
如果您不想在旧代码中修改任何内容,可以使用以下方法:
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的只读方法。之后,我使用apply
调用原始构造函数(myLocalTestHouse
)。
注意:此方法完全透明。创建的实例的行为就像调用原始构造函数一样。