簡體   English   中英

誓言Node.js中的回調測試會產生匿名錯誤

[英]Vows callback testing in Node.js generating anonymous errors

我不熟悉Node.js應用程序中使用的異步計算的連續傳遞樣式,並且正在努力掌握一些相當基本的代碼。

我正在嘗試編寫一個庫,該庫將創建一個到imap.gmail.com的imap接口,並且我正在嘗試在BDD中添加“ vows'.js”(成功的程度各不相同。我絕對不會遵循完整的紅色->代碼->我應該是的綠色周期,但是很難以這種語言開始。

相關的測試用例如下所示:

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)

如果我在“ ERROR BEING GENERATED HERE”這一行的正上方寫了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);
  });
};

我哪里可能出問題了? 謝謝你的幫助!

我建議閱讀有關“此”的工作原理的文章。 如果沒有人搞砸它,那that.callback引用父對象,該父對象用文字字符串標記為“ GMailInterface對象可以”。

我懷疑這是使您絆倒的因素。 “回調”應定義為與“主題”方法具有相同對象的方法,您可以采用各種方式進行設置,而這並不意味着它的工作方式。

默認情況下,“ this”通常指最近的祖先/父對象。 除非使用'new'關鍵字將其用作構造函數,否則它將忽略包裝函數,在這種情況下,它表示對象實例。 對於DOM中的事件回調(瀏覽器JS-不是我不了解事件的node.js),它通常是指已觸發事件的對象。

沒有真正的糾結固定在那和自我上。 我們只是傾向於使用那些,以確保在對象具有聚合對象的情況下,我們正在處理頂部對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM