2015-11-03 137 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中的服务器! –