Howto:常规测试,看看小部件是否调用this.herited成功

Howto: generic test to see if widgets call this.inherited succesfully?

本文关键字:是否 调用 this 成功 herited 小部 常规 测试 Howto      更新时间:2023-09-26

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

我不得不处理的许多缺陷/bug都是由于覆盖方法(如destroystartuppostCreate)中缺少this.inherited(arguments)调用造成的。

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

我怀疑我可以使用dojo'aspect.after挂接"base"实现,但我不确定如何获取_widgetBase方法本身的句柄。

仅仅在我自己的小部件的方法上使用.after是没有意义的,因为这不会检查this.inherited(..)是否被inded调用。

如何编写一个通用测试函数,该函数可以传递给任何dijit/_WidgetBase实例,并检查在子类化小部件本身调用相同方法时,是否从小部件调用了上述_widgetBase的方法?

最重要的是,我如何获得对上述功能的基本实现的引用?

在阅读了dojo的文档、declare.js代码、调试、谷歌搜索、调试和黑客攻击后,我最终使用了这段代码来获取上一个继承类/mix-in的基方法的句柄,但我对调用getInherited:所涉及的黑客行为并不完全满意

Edit 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);
    });

我已经放弃尝试使用dojo/aspect

相反,我选择修改我们的自定义基础小部件的代码,以包含如下片段。当创建控制台调用及其内容被删除的发布版本时,它们会被自动删除:

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

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