2012-02-20 103 views
0

我試圖用nodeunit來測試我的Web服務器:Nodeunit執行順序?

test.js

exports.basic = testCase({ 

    setUp: function (callback) { 
    this.ws = new WrappedServer(); 
    this.ws.run(PORT); 
    callback(); 
    }, 

    tearDown: function (callback) { 
    delete this.ws; 
    callback(); 
    }, 

    testFoo: function(test) { 
    var socket = ioClient.connect(URL); 
    console.log('before client emit') 
    socket.emit('INIT', 1, 1); 
    console.log('after client emit'); 
    } 
}); 

,這是我最簡單的服務器的NodeJS:

WrappedServer.prototype.run = function(port) { 
    this.server = io.listen(port, {'log level': 2}); 
    this.attachCallbacks(); 
}; 

WrappedServer.prototype.attachCallbacks = function() { 
    var ws = this;  
    ws.server.sockets.on('connection', function(socket) { 
    ws.attachDebugToSocket(socket); 

    console.log('socket attaching INIT'); 
    socket.on('INIT', function(userId, roomId) { 
     // do something here 
    }); 
    console.log('socket finished attaching INIT'); 
    }); 
} 

基本上我得到這個錯誤:

[...cts/lolol/nodejs/testing](testingServer)$ nodeunit ws.js 
    info - socket.io started 
before client emit 
after client emit 
    info - handshake authorized 1013616781193777373 
The "sys" module is now called "util". It should have a similar interface. 
socket before attaching INIT 
socket finished attaching INIT 
    info - transport end 

不知何故,socket在服務器之前發出INIT爲插座添加回調函數。

這是怎麼發生的?另外,做這件事的正確方法是什麼?

回答

0

我假設你期待的順序是這樣?連接INIT之前

  • 插座
  • 插座成品連接INIT
  • 客戶端發出
  • 之前客戶端發出

之後,從給定的代碼量小,這個問題可能是兩件事情。

首先,可能是主要的問題,是你的ioClient.connect不會立即連接。你需要通過某種回調到的,並放出INIT,然後執行測試的callback功能一旦實際連接。

其次,你應該做同樣的事情與你run命令。 listen不會立即偵聽,因此如果它在執行測試時沒有開始偵聽,您偶爾會遇到不一致的結果。您還應該將設置的callback設置爲io.listen

更新

要明確爲listen,就像在節點大多數事情一樣,在socketio服務器的listen方法是異步的。調用該方法會告訴它開始監聽,但在服務器設置網絡內容開始監聽的背景中有一段時間。就像節點的核心listenhttp://nodejs.org/docs/latest/api/net.html#server.listen一樣,socket.io的版本接受一個服務器啓動並正在監聽的回調參數。

io.listen(port, {'log level': 2}, callback); 

除非socket.io開始爲您提供關於連接失敗的錯誤,這可能不是一個問題,但它是值得牢記。將異步操作視爲瞬時處理是一種簡單的方法,可以使偶爾出現的錯誤成爲可能。由於您run包裝聽,我想一般,不只是爲了測試,傳遞一個回調run將是一個非常好的主意。

+0

謝謝你的提升。關於「你也應該把setUp的回調傳遞給io.listen」你是什麼意思?至於io.listen並不真正採取回調。即使這樣做,這意味着我將從我的測試文件注入代碼到我的實際服務器? – disappearedng 2012-02-21 00:56:04

+0

更新了我的答案。 – loganfsmyth 2012-02-21 01:09:50