0

我有一个第一个在那里的鸡或蛋......问题。

AlarmOverlay 派生自 OverlayView。

在通过调用构造函数创建 AlarmOverlay 之前,从 OverlayView 继承已经需要“google”对象。但是谷歌对象只是通过构造函数传递......

我不能用 requirejs 注入 google 对象,因为我用这个 AlarmOverlay 类编写了一个单元测试,所以必须避免任何 http 调用......我正在传递我自己的 google 假对象。

我如何重写我的代码,当新的 google.maps.OverlayView() 调用完成时,google 对象不是未定义的?

    define(['jquery','inject google here is not allowed because of the unit test'], function($) {

    AlarmOverlay.prototype = new google.maps.OverlayView();

    function AlarmOverlay(bounds, alarmNumber, alarmCssClass , google) {

        this.google = google;
    }    

    AlarmOverlay.prototype.createMapOnOverlay = function (map) {

    };

    AlarmOverlay.prototype.onAdd = function() {

    };

    AlarmOverlay.prototype.draw = function() {

    };

    return AlarmOverlay;

});
4

1 回答 1

0

你应该配置 requirejs 在单元测试时传入一个模拟的 google 对象,在生产中运行时传入真实的 google 对象。这样,您的 AlarmOverlay 对象在任何一种情况下都不需要更改。

模拟对象模拟对象的行为,以便您的单元可以毫无意外地调用模拟。在这种情况下,您的模拟对象可能需要maps.OverlayView,像这样实现:

mygoogle.js

define(function() {
   return {
    maps: { OverlayView: function() {} }
  }
}

然后,在测试期间,您将google模块映射到mymodule,可能像这样:

main.js 或 page.html

requirejs.config({
  paths: {
      google: '../mocks/mygoogle.js'
  }
});

在生产过程中,您将 google 模块映射到成熟的 google 对象:

main.js 或 page.html

requirejs.config({
  paths: {
      google: '[your production google]'
  }
});

现在您可以使用相同的代码进行生产和测试:

警报覆盖.js

define(['jquery','google'], function($, google) {

/* reference 'google' anywhere in this module */ 
function AlarmOverlay(bounds, alarmNumber, alarmCssClass) {

}    

AlarmOverlay.prototype = new google.maps.OverlayView();

AlarmOverlay.prototype.createMapOnOverlay = function (map) {

};

AlarmOverlay.prototype.onAdd = function() {

};

AlarmOverlay.prototype.draw = function() {

};

return AlarmOverlay;

});
于 2013-05-21T19:44:22.333 回答