问题
我想测试以下 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 。之后,我使用 apply
调用原始构造函数 (myLocalTestHouse
) .
注意:此方法是完全透明的。创建的实例的行为就像您调用原始构造函数一样。
关于javascript - Mocha 测试: faking a method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854637/