我對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);
});
};
哪裏可能會出錯?謝謝你的幫助!
對於有類似問題的未來人士 - 我只是轉而使用'mocha',這在我看來是一個更好的BDD測試框架。它給了我一個更加簡潔和易於理解的錯誤,並很快解決了我的問題(這實際上是一個在不同函數中啓動的連接中的失控事件循環。) – eblume