摩卡测试:伪造一种方法

时间:2013-05-31 09:56:40

标签: javascript mocha

问题

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

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

1 个答案:

答案 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)。

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