2012-04-30 4 views
0

Node.js 응용 프로그램에 사용 된 비동기 계산 스타일을 계속 사용하는 것에 익숙하지 않은데, 상당히 기본적인 코드를 손쉽게 잡으려고 애 쓰고 있습니다.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) 

내가 바로 "오류가 여기에 생성되는"으로 라인 위에 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의 'that'은 'A GMailInterface object can'이라는 리터럴 문자열로 레이블 된 부모 객체를 참조합니다.

나는이 요소가 당신을 걸고있는 것으로 생각합니다. '콜백'은 'topic'메쏘드와 동일한 객체의 메쏘드로 정의해야합니다. 메쏘드가 설정되어 있고 그것이 작동하도록 의도 된 방식대로 나를 공격하지 않습니다.

'this'는 일반적으로 기본적으로 가장 가까운 상위 항목/상위 항목을 나타냅니다. 'new'키워드를 사용하여 생성자로 사용하지 않는 한 래핑 함수를 무시합니다.이 경우 'it'는 객체 인스턴스를 나타냅니다. DOM (브라우저 JS - 이벤트까지 자세히 알려지지 않은 node.js가 아닌)의 이벤트 콜백의 경우 일반적으로 이벤트가 트리거 된 객체를 참조합니다.

그 자체로 해결되는 진짜 kludge가 없습니다. 우리는 객체에 집계 객체가있는 경우 최상위 객체를 처리하고 있는지 확실하게하기 위해 이러한 객체를 사용하는 경향이 있습니다.

+0

팁 주셔서 감사합니다. 나는 '이'의 구속력을보다 철저히 조사 할 필요가있다. 그러나 [vows documentation] (http://vowsjs.org/)에 따르면 (가장 어두운 부분의 마지막 부분 (비동기식으로 바나나 껍질을 벗겨내는 부분)을 확인하십시오.), 'this'가 바운드되고있는 것처럼 보입니다. 'vow' 자체로'callback' 메소드를 실제로 가지고있는 것입니다. 'callback'의 args에서'gm'을'true'와 같은 다른 것으로 바꾸면 확인이됩니다.이 명령은 콘솔에 ">>> true"를 출력 한 다음 무기한 정지합니다. – eblume

+0

좋아, 글쎄, 예제에서 나는 'topic'에 할당 된 것에 대한 새로운 키워드의 사용을보고있다. 즉, 객체가 생성되고 있음을 의미합니다. 주제가 반응을 보이는 이벤트에 부딪 힐 가능성이 높으므로 이에 대한 가능성이 높습니다. –

관련 문제