如何:基因测试,看看小部件是否称之为.inherher成功?

时间:2014-09-24 06:59:18

标签: javascript dojo doh

我在我工作的公司维护一个由许多dijit小部件组成的自定义库。

我必须处理的许多缺陷/错误都是由this.inherited(arguments) destroystartup等重写方法遗漏postCreate次调用的结果。

其中一些很容易被忽视,直到很久以后才被发现。

我怀疑我可以使用dojo\aspect。之后可以使用this.inherited(..)。实现,但我不知道如何获取_widgetBase方法本身的句柄。

仅仅在我自己的小部件的方法上使用.after是没有意义的,因为那不会检查dijit/_WidgetBase是否被调用。

如何编写可以传递给任何{{1}}实例的通用测试函数,并检查在子类化小部件本身调用相同方法时是否从小部件调用上面提到的_widgetBase方法?

底线是如何获取对上述函数的基本实现的引用?

2 个答案:

答案 0 :(得分:0)

阅读了dojo的文档,declare.js代码,调试,谷歌搜索,调试和黑客攻击我最终得到这段代码来获取最后一个继承类/混合的基本方法的句柄,但我是对调用getInherited所涉及的黑客并不完全满意:

编辑2 我用空数组替换了getInherited的第二个参数。虽然我实际上使用aspect来获取对基类方法的引用但是不起作用。看来这种方法很破灭。

require(['dijit/registry','dojo/_base/declare','mycompany/widgets/widgetToTest'],
function(registry,declare,widgetToTest)
    {

      var widget = registry.byId('widgetToTestId');
      var baseStartup = getBaseMethod(widget,'startup');

      function getBaseMethod(widget,methodName){
        return widget.getInherited(methodName,[]);
      }

      //This is the method body I want to use .after on to see if it was called, it returns the last overriden class in the array of inherited classes. (a mixin in this case, good enough for me!)
      alert(baseStartup);

    });

答案 1 :(得分:0)

我放弃了尝试使用dojo/aspect

我选择修改自定义基本小部件的代码以合并下面的代码段。在创建发布版本时会自动删除它们,其中删除了控制台调用及其内容:

console.log( 
        function(){
            (this._debugInfo = this._debugInfo|| {}).postCreate=true;
        }.call(this)  
    );

我在单元测试附近添加的样板代码中的一个简单方法是可用的,这样我就可以在各自的单元测试中的所有mycompany.widgets.basewidget个实例上调用它。