2015-11-03 88 views
0

試圖包裹我的頭在節點中的TCP服務器和在摩卡測試!測試一個socket.on('數據')回調沒有摩卡超時

這是我到目前爲止已經完成:

在TCP-server.js

'use strict'; 
var net = require('net'); 
var fs = require('fs'); 

var server = module.exports.server = net.createServer(function(socket){ 
    socket.on('data', function(data){ 
    console.log(data.toString()); 
    var requestString = "Requested on: " + new Date().toString() + "\n" + data.toString(); 
    var writeStream = fs.createWriteStream("datalog.log", {'flags': 'a'}); 
    writeStream.write(requestString); 
    writeStream.end(); 
    }); 

    socket.on('end', function(){ 
    console.log('socket closed'); 
    }); 
}); 

server.listen('3000', function(){ 
    console.log('server up'); 
}); 

而且在test.js:

var fs = require('fs'); 
var net = require('net'); 
var expect = require('chai').expect; 
var server = require(__dirname + "/../tcp-server.js").server; 
var request = require('superagent'); 

describe('the tcp server', function() { 

    beforeEach(function(){ 
    server.listen('3000', function(){ 
     console.log('server up in mocha!'); 
    }); 
    }); 

    it('should log all requests to a log file', function(done){ 
    request.get('http://localhost:3000').end(function(err, res){ 
    expect(true).to.equal(false); //This test doesn't run 
    //eventually write some fs code that tests if the log file is written to; 
     done(); 
    }); 
    }); 
}); 

它看起來像的console.log (data.toString())行在tcp-server.js觸發,但console.log不更新。只有在摩卡超時時纔會更新日誌(即沒有完成()調用)。

任何想法如何確保'data'事件執行後應執行的所有操作都能執行,以便我可以檢查日誌是否已更新?

謝謝!

編輯:問題不是與測試,但與TCP服務器(我沒有正確關閉它)。

在TCP-server.js

'use strict'; 
var net = require('net'); 
var fs = require('fs'); 

var server = module.exports.server = net.createServer(function(socket){ 
    socket.on('data', function(data){ 
    var requestString = data.toString(); 
    var writeStream = fs.createWriteStream("datalog.log", {'flags': 'a'}); 
    writeStream.write(requestString); 
    writeStream.end(); 
    socket.end(); 
    }); 

    socket.on('end', function(){ 
    console.log('socket closed'); 
    server.close(); 
    }); 
}); 

server.listen('3000', function(){ 
    console.log('server up'); 
}); 

var client = net.connect({port: 3000}, 
    function() { //'connect' listener 
    console.log('connected to server!'); 
    client.write("Requested on: " + new Date().toString() + "\n"); 
}); 

而在test.js

var fs = require('fs'); 
var net = require('net'); 
var expect = require('chai').expect; 
var server = require(__dirname + "/../tcp-server.js").server; 

describe('the tcp server', function() { 
    var logstringBefore = ""; 
    var logstringAfter = ""; 

    before(function(done){ 
    fs.readFile('datalog.log', function(err, data){ 
     logstringBefore = data.toString(); 
     done(); 
    }); 
    }); 

    it('should log all requests to a log file and change it', function(done){ 
    server.listen('3000', function(){ 
    var requestString = "Requested on: " + new Date().toString(); 
     console.log('server up in mocha!'); 
     fs.readFile('datalog.log', function(err, data){ 
     logstringAfter = data.toString(); 
     expect(logstringAfter).to.include(requestString); 
     expect(logstringBefore).to.not.equal(logstringAfter); 
     done(); 
     }); 
    }); 
    }); 
}); 
+0

[與摩卡的Ajax測試 - 的NodeJS]的可能的複製(http://stackoverflow.com/questions/29166591/ajax-testing-with-mocha-nodejs) – Tyler

回答

1

done()end()之後調用執行完畢即當回調被觸發如下所示。

也考慮重新考慮像下面的代碼。 server.listen()轉移到before(),所以它只對describe()內部的所有it()執行一次,done()server.listen()中回撥。這將確保在執行it()之前服務器已準備就緒。

describe('the tcp server', function() { 

    before(function(done){ 
    server.listen('3000', function(){ 
     console.log('server up in mocha!'); 
     done(); 
    }); 
    }); 

    beforeEach(function(){}); 

    it('should log all requests to a log file', function(done){ 
    request.get('http://localhost:3000').end(function(err, res){ 
     expect(true).to.equal(false); 
     done(); 
    }); 
    }); 
}); 
+0

呀,做()語句在那裏將運行測試,但套接字似乎沒有保持足夠長的時間寫入日誌文件......我想。 –

+1

我已經更新了我的答案。請讓我知道是否解決了這個問題。 – Josnidhin

+0

謝謝。是的,完成的電話應該工作!我忘了關閉tcp-server.js中的服務器! –