2011-10-03 51 views
2

說我有以下順序:在Vows.js中,如何在通過異步回調後恢復原始主題?

vows.describe('Example').addBatch({ 
    'An example' : { 
     topic: new Example(), 
     'with an async method' : function(example) { 
     example.asyncMethod(this.callback); 
     }, 
     'will do some magic' : function(err, result) { 
     assert.equal(result.magical, true); 
     }, 
     'and then we will be back on track' : function(example) { 
     assert.isTrue(example.backOnTrack); 
     } 
    } 
}).run(); 

是測試「and then we will be back on track」可能打從之前的話題(Example)?

編輯

vows.describe('Example').addBatch({ 
    'An example' : { 
     topic: function(example){ // <- where example is a parent topic 
     example.asyncMethod(this.callback); 
     },  
     'callback after an async method will do some magic' : function(err, result) { 
     assert.equal(result.magical, true); 
     }, 
     'and then we will be back on track' : function(example) { 
     assert.isTrue(example.backOnTrack); 
     } 
    } 
}).run(); 

回答

3

一個主題返回將被髮送到所有你的誓言的話題。

在該第一個誓約"with an async method"this.callback未定義,因爲回調只在主題中定義。在第二個誓言參數是exampleerr, result

如果你想要做的,你需要設置的函數,你的主題,並使用this.callback或從主題返回EventEmitter任何異步測試。

編輯:

你有問題,從誓言返回多個主題。這不可能。

最簡單的方法是返回一個新的話題,是兩個話題的數組。這感覺很ha。。

更好的解決辦法是,以確保您在隔離測試你的主題。基本上你的測試「副作用」已經成功發生。副作用應該永遠不會發生

+0

謝謝,我實際上已經通過你的文檔(順便說一下,再次感謝你的誓言,相當了不起),但忘了編輯問題。 我已經編輯過,雖然你所描述的。在你所描述的和我編輯的代碼中(假設他們匹配),你將如何跳回到'然後我們會回到正軌'的例子?可能嗎? – Chance

+0

我基本上試圖測試異步方法的副作用,並且需要能夠重新獲得對'example'的訪問權限才能這樣做。 – Chance

+0

@讓你不要跳回來。誓言不允許這樣做。你只能返回一個主題。這裏有一些攻擊手段。 – Raynos

0

據我瞭解,topic S是否使用簡單topic: somethingtopic: function(...語法,執行僅一次。隨着誓言順序執行,在你的第二個例子中,你將會處理修改後的example

我會採取簡單的,但兩次測試分成子環境和具有topic: new Example()兩個實例的那種惱人的路線。

+0

羅,主題可以蔓延多個測試,並將結果傳遞到下一個。當你使用this.callback作爲一個函數時,它將自身設置(或者說,序列中的下一個項目......有點)作爲回調。就我所知,這是成功測試異步行爲的唯一方法。 – Chance