发誓在Node.js中进行回调测试,生成匿名错误

时间:2012-04-30 23:24:45

标签: javascript node.js asynchronous bdd vows

我是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)

如果我在“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);
  });
};

我哪里可能出错?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我建议阅读“这个”的工作原理。如果没有人在弄乱它,that.callback的'that'指的是用文字字符串标记为“GMailInterface对象可以”的父对象。

我怀疑是这个因素绊倒了你。 'callback'应该被定义为与'topic'方法相同的对象的方法,就像你设置的东西一样,并且不会像我的工作方式那样让我感到震惊。

'this'通常是指默认情况下最近的祖先/父对象。它忽略包装函数,除非它们被用作使用'new'关键字的构造函数,在这种情况下它指示对象实例。对于DOM中的事件回调(浏览器JS - 而不是node.js,我对事件我并不深入了解),它通常指的是触发了事件的对象。

没有真正的kludge与那个和自我固定。我们倾向于使用那些来确定我们在对象具有聚合对象的情况下解决顶层对象。