2012-04-30 19 views
0

我對Node.js應用程序中使用的異步計算的繼續傳遞風格很陌生,我正在努力掌握一些相當基本的代碼。在Node.js中產生匿名錯誤的回調測試

我想寫一個庫,它將創建一個imap.gmail.com的imap接口,並且我試圖按照'vows'.js'的BDD(不同級別的成功。我絕對不是遵循完整的紅色代碼 - >綠色循環,但我很難從一種語言開始)。

相關的測試用例是這樣的:

var gmail = require('../lib/gmail.js'), 
    vows = require('vows'), 
    assert = require('assert'), 
    fs = require('fs'); 

vows.describe('Basic interface tests').addBatch({ 
    'A GMailInterface object can': { 
    topic: function() { 
     var gm = Object.create(gmail.GMailInterface); 
     var settings_file = 'test/test_settings.json'; 
     var settings = JSON.parse(fs.readFileSync(settings_file)); 
     var that = this; 
     gm.connect(settings.email,settings.password,function() { 
     that.callback(gm); // ERROR BEING GENERATED HERE 
     }); 
    }, 
    // ACTUAL VOWS OMITTED - the following is just a test of the callback 
    'find an email' : { 
     topic: function(gm) { 
     console.log(">>>",gm); 
     }, 
    } 
    } 
}).export(module) 

如果我寫的console.log消息右「錯誤生成這裏的」線以上,將打印。如果我在它下面留言,不會。測試的輸出提供了以下錯誤:

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: Uncaught, unspecified 'error' event. 
    at EventEmitter.<anonymous> (events.js:50:15) 
    at EventEmitter.emit (/Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows.js:236:24) 
    at /Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows/context.js:31:52 
    at Object.callback (/Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows/context.js:46:29) 
    at Array.0 (/Users/eblume/Repositories/my_stuff/gmail/test/gmail_test.js:17:14) 
    at EventEmitter._tickCallback (node.js:192:40) 

在gmail.js的代碼是有點過分,張貼在這裏,但這裏是什麼,我認爲是相關的部分 - 我可以發佈更多,如果你問下面是一個問題。

gm.connect = function(username,password,cb) { 
    var self = this; 
    self.conn = new ImapConnection({ 
    username: username, 
    password: password, 
    host: 'imap.gmail.com', 
    port: 993, 
    secure: true 
    }); 

    async.series([ 
    function(callback){self.conn.connect(callback); }, 
    function(callback){self.conn.openBox('[Gmail]/All Mail',true,callback);} 
    ], 
    function(err,results) { 
    if (err) { 
     die(err); 
    } 
    process.nextTick(cb); 
    }); 
}; 

哪裏可能會出錯?謝謝你的幫助!

+0

對於有類似問題的未來人士 - 我只是轉而使用'mocha',這在我看來是一個更好的BDD測試框架。它給了我一個更加簡潔和易於理解的錯誤,並很快解決了我的問題(這實際上是一個在不同函數中啓動的連接中的失控事件循環。) – eblume

回答

1

我推薦閱讀「這個」是如何工作的。如果沒有人一直在搞這個,那麼that.callback的'那個'指的是用文字字符串標記爲'A GMailInterface對象可以'的父對象。

我懷疑是這個因素讓你失望。 'callback'應該被定義爲與'topic'方法相同的對象的一種方法,就像你設置事物的方式一樣,並且不會影響我的工作方式。

默認情況下,'此'通常指最近的祖先/父對象。它忽略了包裝函數,除非它們被用作使用'new'關鍵字的構造函數,在這種情況下,它指示對象實例。在DOM中的事件回調(瀏覽器JS - 不是node.js,我並不深入事件),它通常指的是觸發事件的對象。

有沒有真正的混合物被固定與自我。我們傾向於使用這些來確定在對象具有聚合對象的情況下我們正在處理頂層對象。

+0

感謝您的提示 - 而且您絕對正確我需要更徹底地調查「這個」的約束力。然而,基於[vows documentation](http://vowsjs.org/)(查看最黑暗部分中的最後一個例子 - 關於異步剝香蕉的例子),它看起來像'this'被綁定到事實上'vows'本身就具有'callback'方法。 這可以通過在'callback'的參數中替換'true'來確認,它將「>>> true」打印到控制檯,然後無限期地掛起。 – eblume

+0

好的,在示例中,我看到使用新關鍵字來分配「主題」。這意味着正在創建一個對象。話題很可能受到正在作出反應的事件的打擊,所以這可能是目標。 –

相關問題