2014-09-24 48 views
0

我在我工作的公司維護一個由許多dijit小部件組成的自定義庫。Howto:通用測試,以查看小部件是否成功調用this.inherited?

許多缺陷/錯誤,我不得不應付的人的電話this.inherited(arguments)從被覆蓋的方法,如destroystartuppostCreate缺失的結果。

其中一些很容易被忽視,直到很晚才發現。

我懷疑我可以使用dojo\aspect .after來掛鉤'base'實現,但我不知道如何獲得_widgetBase方法本身的句柄。

僅僅使用.after在我自己的小部件的方法將是毫無意義的,因爲那不會檢查this.inherited(..)是否被inded調用。

如何編寫一個可以通過任何dijit/_WidgetBase實例的通用測試函數,並檢查在子類化窗口小部件上調用同一方法時是否從窗口小部件調用上述_widgetBase方法?

底線是我如何獲得對上述功能的基礎實現的引用?

回答

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

    }); 
0

我放棄了試圖使用dojo/aspect

我改爲選擇修改我們的自定義基本小部件的代碼,以合併下面的代碼片段。創建一個發佈版本中,控制檯呼叫和其內容被刪除時,它們將被自動刪除:

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

在樣板代碼的簡單方法,我添加了單元測試接近可用,這樣我可以把它所有的mycompany.widgets.basewidget實例在各自的單位測試中。

相關問題