2013-02-01 49 views
1

有誰知道使用doh來測試某個對象是否訂閱了特定主題的方法嗎?Dojo和doh:測試特定主題訂閱

我很努力地找到任何文檔描述這種類型的測試。

我問這個問題的原因是因爲我構建我的小部件時,我訂閱了一個主題。我想要有一個單元測試,測試構件在構建後是否始終擁有該主題訂閱。

我的主題有一個私有變量,我在創建訂閱時用作主題字符串。

因此,例如,這裏有一個名爲「CustomTopic」主題:

define([], function(){ 

    var topicString= "topicString"; 

    return { 
     TOPIC_STRING: function(){ 
      return topicString; 
     } 
    } 
}) 

,並在我的插件的構造是這樣的:

constructor: function() { 
    topic.subscribe(CustomTopic.TOPIC_STRING(), function(params) {doSomething(params)}); 
} 

所以你可以看到這將是多麼容易檢查對於針對私有變量值的主題訂閱,如果我只能弄清楚如何查看我的小部件的所有訂閱?

參考:

Dojo 1.8 docs

Dojo's test util "doh" docs

+0

僅供參考:'_WidgetBase'提供了一個訂閱方法,當widget被銷燬時它將取消訂閱。 – McDowell

+0

謝謝麥克道威爾很高興知道。 – Jeremy

回答

2

我建議你的測試將更加強勁/有用的,如果它集中行爲,而不是執行。在這種情況下,測試您的小部件是否響應該主題(或更好地,導致發佈該主題的事件,以進行更多的集成測試)而不是嘗試捕獲訂閱本身會更有意義。

當然,你可以嘗試包裝topic.subscribe(壞東西),或者檢查你的小部件的私有處理列表(另一個壞的東西)。順便說一句,我希望你實際上保存了topic.subscribe返回的句柄,這樣你可以在對象被銷燬後刪除(之前取消訂閱)。

比那些簡單地製作一個新對象,發佈到該主題,並查看是否調用doSomething或者是否發生所需結果更好。雖然doh不提供監聽函數調用的支持,但dojo/aspect對於此目的是理想的。所以,你可能有這樣的事情:

var myWidget = new myWidget(); // presumably subscription happened, 
           // but we only care about later behaviour 
var somethingDone = false; 
aspect.after(window, "doSomething", function(){somethingDone = true;}); 
topic.publish(CustomTopic.TOPIC_STRING()); 
doh.assertTrue(somethingDone); 

事實上,我認爲DoSomething的是不是一個全球性的方法,所以你不得不範圍,妥善,但除此之外,這應該很好地工作。目前topic.publish是同步的,所以這應該可以正常工作,但它可能會在未來變成異步,在這種情況下,您希望避免在稍後階段調用doh.assertTrue。

+0

我很欣賞你來自哪裏,檢查是否達到了預期的行爲是我曾經考慮過的事情,並且最終可能是我最終編寫測試的方式。但我真的只想知道如何查看特定對象的所有訂閱。必須有一個訂閱功能映射的地方?基本上我希望找到一個小工具所有主題訂閱的getter。 – Jeremy

+0

pre 1.7(我仍然使用1.4.3的大部分工作=()你會使用這個。subscribe()在混合_Widget的任何類中,這會將訂閱添加到一個內部數組(_subscribe或類似的東西,絕對是私有的),您可以想象它會檢查。 在1.7中,模式是this.own(handle1,handle2);對於在_WidgetBase中混合的類,我不知道它存儲句柄的位置,但是我保證它是專用的。你可以簡單地實現你自己的控制陣列,但它看起來像額外的工作。 –

+0

其實,不,我只是檢查,this.own(定義在這裏:[Destroyable](http://svn.dojotoolkit.org/src/dijit/trunk/Destroyable.js))實際上不使用內部數組,所以那裏沒有運氣。 –