测试socket.on('data')回调,而不会让摩卡超时

Testing a socket.on('data') callback without having mocha time out

本文关键字:超时 摩卡 on socket data 测试 回调      更新时间:2023-09-26

试图在节点中围绕TCP服务器并在摩卡中进行测试!

这是我到目前为止所做的:

在 tcp 服务器中.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');
});

在测试中.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();
    });
  });
});

看起来 tcp-server.js 中的 console.log(data.toString((( 行触发了,但控制台.log没有更新。日志似乎仅在摩卡超时时才更新(即没有 done(( 调用(。

有什么想法,我如何确保在"data"事件之后应该执行的所有内容都执行,以便我可以检查日志是否已更新?

谢谢!

编辑:问题不在于测试,而在于TCP服务器(我没有正确关闭它(。

在 tcp 服务器中.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");
});

并在测试中.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();
       });
    });
  });
});

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();
    });
  });
});