2

问题

我有以下要测试的 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方法。

我做错了什么?还有另一种方法可以做同样的事情吗?

4

1 回答 1

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。之后,我myLocalTestHouse使用apply.

注意:此方法是完全透明的。创建的实例的行为就像您在调用原始构造函数一样。

于 2013-05-31T10:34:24.233 回答